我正在尝试实现mergesort算法,我做了你在下面看到的,但我似乎没有得到正确的结果,请检查我的代码,让我知道我错过了什么。
package test;
public class MergeSort {
private static void mergesort(int[] arr, int n) {
int mid;
int[] left;
int[] right;
if(n<2 ){return;}
mid = n/2;
left = new int[mid];
right = new int[n-mid];
for(int i=0;i<mid;i++){
left[i]=arr[i];
}
for(int i=mid;i<n;i++){
right[i-mid]=arr[i];
}
mergesort(left,mid);
mergesort(right,n-mid);
merge(arr,left,mid,right,n-mid);
}
private static void merge(int[] arr, int[] left, int leftcount, int[] right, int rightcount) {
// TODO Auto-generated method stub
int i,j,k;
i=0;j=0;k=0;
while(i<leftcount && j<rightcount){
if(left[i] <right[i]){
arr[k]=left[i];
k++;
i++;
}
else{
arr[k]=right[j];
k++;
j++;
}
}
//copy what left if any
while(i<leftcount){
arr[k]=left[i];
k++;
i++;
}
//copy whats left if any
while(j<rightcount){
arr[k]=right[j];
k++;
j++;
}
}
public static void main(String[]args){
int[] arr = {2,4,1,7,3};
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
mergesort(arr,arr.length);
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i] +" ");
}
}
}
正如您所看到的要排序的测试数组是{2,4,1,7,3}
;但我把它作为我的排序数组{1 3 7 2 4}
答案 0 :(得分:6)
你的问题就在这一行:
if(left[i] <right[i]){
假设您现在有两个子集:{2, 4}
和{1, 3, 7}
。
i = 0: right[i] < left[i]
获得{1}
i = 1: right[i] < left[i]
您得到的是{1, 3}
而不是{1, 2}
。
因此,您的问题与left[]
和right[]
的索引相同。
解决方案:将该行更改为
if(left[i] <right[j]){
注意:此外,学习调试,这是一项非常重要的技能。