合并排序不排序数组
merge sort not sorting array
我在阅读了归并排序后编写了下面的 Java 代码。 运行 代码没有错误,但合并排序没有对数组进行排序。它只是 returns 原始的未排序数组。我终生无法弄清楚问题出在哪里。我很感激任何线索。
public class mergeSort {
public void mergeSort(int array[], int n){
if(n<2) return;
int m=n/2;
int left[]=new int[m];
int right[]=new int[n-m];
int i;
for(i=0; i<m;i++){
left[i]=array[i];
}
for( i=m; i<n;i++){
right[i-m]=array[i];
}
printArray(left);
printArray(right);
mergeSort(left, m);
mergeSort(right, n-m);
merge(array, left, m, right, m-n);
}
private void merge(int[] array, int[] left, int leftCount, int[] right, int rightCount) {
int i=0,j=0,k=0;
while(i<leftCount && j< rightCount){
if(left[i]<=right[j]){
array[k]=left[i];
i++;
k++;
}else{
array[k]=right[j];
j++;
k++;
}
}
while(i<leftCount){
array[k]=left[i];
i++;
k++;
}
while(j<rightCount){
array[k]=right[j];
j++;
k++;
}
}
static void printArray(int arr[])
{
int n = arr.length;
for (int i=0; i<n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
public static void main(String[] args){
int a[]={3,2,1,7,9,8};
printArray(a);
mergeSort m=new mergeSort();
m.mergeSort(a, a.length);
printArray(a);
}
}
你传递给merge方法的leftCount和rightCount是错误的。
而不是传递它,而是在合并方法中计算它。我通过以下更改尝试了您的代码,它运行良好。
merge(array, left, right);
...
private void merge(int[] array, int[] left, int[] right) {
int i=0,j=0,k=0;
int leftCount= left.length;
int rightCount = right.length;
我在阅读了归并排序后编写了下面的 Java 代码。 运行 代码没有错误,但合并排序没有对数组进行排序。它只是 returns 原始的未排序数组。我终生无法弄清楚问题出在哪里。我很感激任何线索。
public class mergeSort {
public void mergeSort(int array[], int n){
if(n<2) return;
int m=n/2;
int left[]=new int[m];
int right[]=new int[n-m];
int i;
for(i=0; i<m;i++){
left[i]=array[i];
}
for( i=m; i<n;i++){
right[i-m]=array[i];
}
printArray(left);
printArray(right);
mergeSort(left, m);
mergeSort(right, n-m);
merge(array, left, m, right, m-n);
}
private void merge(int[] array, int[] left, int leftCount, int[] right, int rightCount) {
int i=0,j=0,k=0;
while(i<leftCount && j< rightCount){
if(left[i]<=right[j]){
array[k]=left[i];
i++;
k++;
}else{
array[k]=right[j];
j++;
k++;
}
}
while(i<leftCount){
array[k]=left[i];
i++;
k++;
}
while(j<rightCount){
array[k]=right[j];
j++;
k++;
}
}
static void printArray(int arr[])
{
int n = arr.length;
for (int i=0; i<n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
public static void main(String[] args){
int a[]={3,2,1,7,9,8};
printArray(a);
mergeSort m=new mergeSort();
m.mergeSort(a, a.length);
printArray(a);
}
}
你传递给merge方法的leftCount和rightCount是错误的。
而不是传递它,而是在合并方法中计算它。我通过以下更改尝试了您的代码,它运行良好。
merge(array, left, right);
...
private void merge(int[] array, int[] left, int[] right) {
int i=0,j=0,k=0;
int leftCount= left.length;
int rightCount = right.length;