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];