我正在尝试实现一个无法正常工作的mergesort算法。合并排序的工作原理如下:
我。将未排序的列表分成n个子列表,每个子列表包含1个元素(1个元素的列表 被视为已排序)。
II。重复合并子列表以生成新排序的子列表,直到只剩下1个子列表。这将是排序列表。实现如下。
最初,这个方法是递归调用的,直到只有一个元素。
public void mergeSort(int low, int high) {
if (low >= high) {
return;
}
int middle = (low + high) / 2;
// recursion for the merge
mergeSort(low, middle);
mergeSort(middle + 1, high);
merge(low, middle, high);
}
这是提供的合并方法。
private void merge(int low, int middle, int high) {
int i = low, j = middle;
int index = low;
for (int k = 0; k <= high; k++) {
tempArray[k] = nums[k];
}
/*
Copy the smallest values from either the left
or the right side back to the original array
*/
while ((i <= middle) && (j <= high)) {
if (tempArray[i] <= tempArray[j]) {
nums[index++] = tempArray[i++];
} else {
nums[index++] = tempArray[j++];
}
}
// fill the left side of the array
while (i < middle) {
nums[index++] = tempArray[i++];
}
// fill the right side of the array
while (j < high) {
nums[index++] = tempArray[j++];
}
}
这里有什么问题?
输入为int[] arr = {12, 3, 4, 56, -7, 1};
,输出为12 12 12 12 56 56
答案 0 :(得分:0)
我修改了合并功能,现在开始工作了。特别是,j
需要在中期j = middle+1
private void merge(int low, int middle, int high) {
int i = low, j = middle+1;
int index = low;
for (int k = 0; k <= high; k++) {
tempArray[k] = nums[k];
}
/*
Copy the smallest values from either the left
or the right side back to the original array
*/
while ((i <= middle) && (j <= high)) {
if (tempArray[i] <= tempArray[j]) {
nums[index++] = tempArray[i++];
} else {
nums[index++] = tempArray[j++];
}
}
// fill the left side of the array
while (i <= middle) {
nums[index++] = tempArray[i++];
}
// fill the right side of the array
while (j <= high) {
nums[index++] = tempArray[j++];
}
}