Java 这个特殊的合并排序程序是如何工作的?
我正在学习排序算法。我已经通过了以下链接给出的程序。为了简单起见,我附加了链接和程序本身Java 这个特殊的合并排序程序是如何工作的?,java,algorithm,sorting,data-structures,mergesort,Java,Algorithm,Sorting,Data Structures,Mergesort,我正在学习排序算法。我已经通过了以下链接给出的程序。为了简单起见,我附加了链接和程序本身 public class Mergesort { private int[] numbers; private int[] helper; private int number; public void sort(int[] values) { this.numbers = values; number = values.length; this.helper = new int[
public class Mergesort {
private int[] numbers;
private int[] helper;
private int number;
public void sort(int[] values) {
this.numbers = values;
number = values.length;
this.helper = new int[number];
mergesort(0, number - 1);
}
private void mergesort(int low, int high) {
if (low < high) {
int middle = low + (high - low) / 2;
mergesort(low, middle);
mergesort(middle + 1, high);
merge(low, middle, high);
}
}
private void merge(int low, int middle, int high) {
for (int i = low; i <= high; i++) {
helper[i] = numbers[i];
}
int i = low;
int j = middle + 1;
int k = low;
while (i <= middle && j <= high) {
if (helper[i] <= helper[j]) {
numbers[k] = helper[i];
i++;
} else {
numbers[k] = helper[j];
j++;
}
k++;
}
while (i <= middle) {
numbers[k] = helper[i];
k++;
i++;
}
}
公共类合并排序{
私有int[]编号;
私人助理;
私有整数;
公共void排序(int[]值){
这个数字=数值;
数字=值。长度;
this.helper=newint[number];
合并排序(0,数字-1);
}
私有void合并排序(整数低,整数高){
如果(低<高){
int middle=低+(高-低)/2;
合并排序(低、中);
合并排序(中+1,高);
合并(低、中、高);
}
}
私有无效合并(整数低、整数中、整数高){
对于(inti=low;i而言,线索实际上在参考文章中:
// Copy the rest of the left side of the array into the target array
while (i <= middle) {
numbers[k] = helper[i];
k++;
i++;
}
//将数组左侧的其余部分复制到目标数组中
而(i线索实际上在参考文章中:
// Copy the rest of the left side of the array into the target array
while (i <= middle) {
numbers[k] = helper[i];
k++;
i++;
}
//将数组左侧的其余部分复制到目标数组中
while(我做得好吗?你试过桌面检查或调试吗?是的,它正在工作并产生预期的输出。它做得好吗?你试过桌面检查或调试吗?是的,它正在工作并产生预期的输出。是的,更好的问题是为什么我们不需要复制下半年的数字。我已经得到了我的答案。非常感谢:)@S.kalya-不需要后半部分的数字,因为在合并之前已经完成了对临时数组的复制,并且合并正在从临时数组合并回原始数组。如果合并排序更有效,并且根据递归级别在原始和临时缓冲区之间交替合并方向,那么就不会有副本ep,合并将需要从上半部分或下半部分复制任何剩余的数字。在运行大小=1并从原始合并到临时的特定情况下,它将需要复制1个元素。是的,更好的问题是为什么我们不需要复制下半部分的数字。我已经得到了我的答案。非常感谢:)@S.kalya-不需要后半部分的数字,因为在合并之前已经完成了对临时数组的复制,并且合并正在从临时数组合并回原始数组。如果合并排序更有效,并且根据递归级别在原始和临时缓冲区之间交替合并方向,那么就不会有副本ep,合并将需要从上半部分或下半部分复制任何剩余的数字。在运行大小==1的特定情况下,并从原始值合并到临时值,它将需要复制1个元素。