由于某种原因,此合并排序将无法正常运行。这几乎是正确的,但并不完全。合并函数在我测试过的所有排序数组上都能正常工作,而mergeSort函数似乎没有任何明显的问题。我错过了什么?
示例输入:7,1,5,6,9,3,8,0,2,1
。
排序后,0 1 1 1 1 3 1 5 6 1
。
每次合并后:
1 1 5 6 9 3 8 0 2 1
1 1 5 6 9 3 8 0 2 1
1 1 5 6 9 3 8 0 2 1
1 1 5 6 9 3 8 0 2 1
1 1 5 6 9 3 8 0 2 1
1 1 5 6 9 0 3 0 2 1
1 1 5 6 9 0 3 0 1 1
1 1 5 6 9 0 1 1 3 1
0 1 1 1 1 3 1 5 6 1
将1000作为上限添加到数组的末尾,这样如果数组的大小不同,它们总是完成而没有错误。
void mergeSort(int arr[], int p, int r){
if(p < r){
int q = Math.floorDiv(p+r, 2);
mergeSort(arr,p,q);
mergeSort(arr,q+1,r);
merge(arr,p,q,r);
}
}
void merge(int arr[], int p, int q, int r){
int n1 = q-p+1;
int n2 = r-q;
int merge1[] = new int[n1+1];
int merge2[] = new int[n2+1];
for(int i = 0; i<n1; i++)
merge1[i] = arr[p+i];
for(int j = 0; j<n2; j++)
merge2[j] = arr[q+j+1];
merge1[n1] = 1000;
merge2[n2] = 1000;
int i = 0;
int j = 0;
for(int k = p; k<r; k++){
if(merge1[i] < merge2[j]){
arr[k] = merge1[i];
i++;
} else {
arr[k] = merge2[j];
j++;
}
}
}
答案 0 :(得分:0)
我明白了! merge
中的for(int k = p; k<r; k++){
函数存在问题。
基本上,r
是数组中的最后一个索引。因此,通过迭代到数组的最后一个索引之前,我们每次都错过了最后一个数字。
将>
更改为>=