Java 什么';我的合并排序实现有什么问题吗? //合并排序的合并操作 私有静态无效合并(int[]a,int left,int middle,int right){ int[]temp=新int[右-左+1]; int leftCrawler=左,rightcawler=中; int currentIndex=0; 而(leftCrawler

Java 什么';我的合并排序实现有什么问题吗? //合并排序的合并操作 私有静态无效合并(int[]a,int left,int middle,int right){ int[]temp=新int[右-左+1]; int leftCrawler=左,rightcawler=中; int currentIndex=0; 而(leftCrawler,java,algorithm,sorting,mergesort,Java,Algorithm,Sorting,Mergesort,问题可能在于您的副本: //将临时文件复制到 对于(int i=0;i

问题可能在于您的副本:

//将临时文件复制到
对于(int i=0;i
您可能想要的是(注意
左侧+i
):

//将临时文件复制到
对于(int i=0;i

(您的测试没有检测到问题,因为
left
为0。)

您的代码中有3个错误:

  • 合并循环不包括
    a[middle]
    处的元素,因为您使用
    leftCrawler
    而不是:

    // merge operation for merge sort
    private static void merge(int[] a, int left, int middle, int right) {
        int[] temp = new int[right - left + 1];        
        int leftCrawler = left, rightCrawler = middle;
        int currentIndex = 0;
    
        while (leftCrawler < middle && rightCrawler <= right) {
            if (a[leftCrawler] < a[rightCrawler])
                temp[currentIndex++] = a[leftCrawler++];
            else
                temp[currentIndex++] = a[rightCrawler++];
        }
    
        while (leftCrawler < middle)
            temp[currentIndex++] = a[leftCrawler++];
    
        while (rightCrawler <= right)
            temp[currentIndex++] = a[rightCrawler++];
    
        // copy temp into a
        for (int i = 0; i < temp.length; i++)
            a[i] = temp[i];
    }
    
    private static void mergeSort(int[] a, int left, int right) {
        if (right > left) {
            int middle = left + (right - left) / 2;
            mergeSort(a, left, middle);
            mergeSort(a, middle + 1, right);
            merge(a, left, middle, right);
        }
    }
    
    public static void mergeSort(int[] a) {
        int left = 0, right = a.length - 1;
        mergeSort(a, left, right);
    }
    
请注意,第一个错误源于此处使用的有害惯例,其中
右侧
中间
包含在切片中,而不是排除在外。排除右侧边界允许更简单的代码,而无需任何易出错的
+1
/
-1
调整

以下是修改后的版本:

//合并排序的合并操作
私有静态无效合并(int[]a,int left,int middle,int right){
int[]temp=新int[右-左];
int leftCrawler=左,rightcawler=中;
int currentIndex=0;
while(leftCrawler=2){
int middle=左+(右-左)/2;
合并排序(a、左、中);
合并排序(a,中间,右侧);
合并(a、左、中、右);
}
}
公共静态无效合并排序(int[]a){
合并排序(a,0,a.长度);
}

我做了更改,我的输入数组保持完全相同。我承认这一更改是必要的,但我仍然没有对数组进行排序。
  while (leftCrawler <= middle && rightCrawler <= right)
  while (leftCrawler <= middle)
      // copy temp into a
      for (int i = 0; i < temp.length; i++)
          a[left + i] = temp[i];