Java 合并插入排序仅适用于小数组

Java 合并插入排序仅适用于小数组,java,Java,我发现这段代码对合并插入排序很有帮助,但它只适用于一小部分项,我需要能够对大小不超过50000的整数数组进行排序。我添加了进一步的逻辑,以获取项目列表,对它们进行随机排序,然后将排序后的整数写入另一个文件。不知道问题是什么。我弄乱了K的值,但没有运气 import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; im

我发现这段代码对合并插入排序很有帮助,但它只适用于一小部分项,我需要能够对大小不超过50000的整数数组进行排序。我添加了进一步的逻辑,以获取项目列表,对它们进行随机排序,然后将排序后的整数写入另一个文件。不知道问题是什么。我弄乱了K的值,但没有运气

 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Arrays;
 import java.util.Random;
 import java.util.Scanner;

 public class hybridSort 
 {

  public static final int K = 5;
  public static void insertionSort(int arr[], int p, int q) {
   for (int i = p; i < q; i++) {
    int tempVal = arr[i + 1];
    int j = i + 1;
    while (j > p && arr[j - 1] > tempVal) {
        arr[j] = arr[j - 1];
        j--;
    }
    arr[j] = tempVal;
}
int[] temp = Arrays.copyOfRange(arr, p, q +1);
// Arrays.stream(temp).forEach(i -> System.out.print(i + " "));
System.out.println();
}

public static void merge(int arr[], int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
int[] LA = Arrays.copyOfRange(arr, p, q +1);
int[] RA = Arrays.copyOfRange(arr, q+1, r +1);
int RIDX = 0;
int LIDX = 0;
for (int i = p; i < r - p + 1; i++) {
    if (RIDX == n2) {
        arr[i] = LA[LIDX];
        LIDX++;
    } else if (LIDX == n1) {
        arr[i] = RA[RIDX];
        RIDX++;
    } else if (RA[RIDX] > LA[LIDX]) {
        arr[i] = LA[LIDX];
        LIDX++;
    } else {
        arr[i] = RA[RIDX];
        RIDX++;
    }
}
}

public static void sort(int arr[], int p, int r) {
if (r - p > K) {
    int q = (p + r) / 2;
    sort(arr, p, q);
    sort(arr, q + 1, r);
    merge(arr, p, q, r);
} else {
    insertionSort(arr, p, r);
}
}

public static void main(String string[]) {

long startTime= System.nanoTime(); 
System.out.println(startTime);

int arr[] = new int[10];
int y = 0;
int nums;
try {
        Scanner scan = new Scanner(new File("randomNum"));
        while (scan.hasNextInt())
        {
            nums = scan.nextInt();
            arr[y] = nums;
            y++; 
        }
    scan.close();   
} 
catch (FileNotFoundException e) 
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Random rand = new Random();

for (int i = 0; i < arr.length; i++) {
    int randomIndexToSwap = rand.nextInt(arr.length);
    int temp = arr[randomIndexToSwap];
    arr[randomIndexToSwap] = arr[i];
    arr[i] = temp;
}



//int[] A = { 2, 5, 1, 6, 7, 3, 8, 4, 9, 15, 12, 10, 11, 20, 1, 7, 6, 10};
sort(arr, 0, arr.length - 1);


try {
    FileWriter fr = new FileWriter("sortedList");
    BufferedWriter br = new BufferedWriter(fr);
    PrintWriter out = new PrintWriter(br);
    for(int i=0; i<arr.length; i++)
    {
          out.write(Integer.toString(arr[i]));
          out.write("\n");   
    }
    out.close();
}

catch(IOException e){
 System.out.println(e);   
}


 long endTime=System.nanoTime();
 System.out.println(endTime);

 long runTime = endTime-startTime; 
  System.out.println(runTime);


  //  Arrays.stream(A).forEach(i -> System.out.print(i + " "));
   }
   }
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.util.array;
导入java.util.Random;
导入java.util.Scanner;
公共类杂交排序
{
公共静态最终整数K=5;
公共静态void insertionSort(int arr[],int p,int q){
for(int i=p;ip&arr[j-1]>tempVal){
arr[j]=arr[j-1];
j--;
}
arr[j]=tempVal;
}
int[]temp=Arrays.copyOfRange(arr,p,q+1);
//Arrays.stream(temp.forEach)(i->System.out.print(i+);
System.out.println();
}
公共静态无效合并(int arr[],int p,int q,int r){
int n1=q-p+1;
int n2=r-q;
int[]LA=Arrays.copyOfRange(arr,p,q+1);
int[]RA=Arrays.copyOfRange(arr,q+1,r+1);
int-RIDX=0;
int LIDX=0;
对于(inti=p;iLA[LIDX]){
arr[i]=LA[LIDX];
LIDX++;
}否则{
arr[i]=RA[RIDX];
RIDX++;
}
}
}
公共静态无效排序(int-arr[],int-p,int-r){
如果(r-p>K){
int q=(p+r)/2;
排序(arr,p,q);
排序(arr,q+1,r);
合并(arr,p,q,r);
}否则{
插入排序(arr、p、r);
}
}
公共静态void main(字符串[]){
long startTime=System.nanoTime();
系统输出打印LN(开始时间);
int arr[]=新int[10];
int y=0;
int nums;
试一试{
扫描仪扫描=新扫描仪(新文件(“随机数”);
while(scan.hasNextInt())
{
nums=scan.nextInt();
arr[y]=nums;
y++;
}
scan.close();
} 
catch(filenotfounde异常)
{
//TODO自动生成的捕捉块
e、 printStackTrace();
}
Random rand=新的Random();
对于(int i=0;i
“不确定问题出在哪里”。调试代码是否有助于隔离问题?请注意代码中变量的糟糕命名。请使用能够告诉读者问题所在的名称。避免使用所有大写字母,而应严格遵守Java约定!这并不完全是由我的代码组成的,这就是我在理解问题时遇到困难的原因。我同意变量名称。t汉克斯