Mergesort程序陷入了错误

时间:2014-11-13 07:17:47

标签: c++ c arrays sorting mergesort

请帮助我猜测了解以下代码中的错误。 它返回相同的数组。

例如,如果我将2,5,3,1作为输入,则返回2,5,3,1而不进行排序。

示例输出:

Enter the total number of elements: 4
Enter the elements which to be sort: 
2
5
3
1 
Un-Sorted Array: 2531
Sorted Array: 2531

这是我的代码 - 出了什么问题?

#include <iostream>
using namespace std;
int l,m,h;

int merge(int A[], int low, int mid, int high){

    int A1[10];
    int A2[10];
    int n1, n2, i, j, k;

    n1=m-l+1;
    n2=h-m;

    for (i=0; i<n1; i++)
        A1[i]=A[l+i];

    for (j=0; j<n2; j++)
        A1[j]=A[m+j+1];


     A1[i]=9999;
     A2[i]=9999;

     i=0;
     j=0;
     for(k=1; k<=h; k++){
        if (A1[i] <= A2[j])
            A[k]=A1[i++];
        else
            A[k]=A2[j++];
     }
     return 0;

 }

int merge_sort(int A[],int low,int high){

    int mid;

    if(low<high){
        mid=(low+high)/2;
        merge_sort(A,low,mid);
        merge_sort(A,mid+1,high);
        merge(A,low,mid,high);
    }
    return 0;
 }

 int A[20];

 int main(){

     int  i,n;

     cout << "Enter the total number of elements: ";
     cin >> n;

     cout << "\nEnter the elements which to be sort: ";

     for(i=0;i<n;i++){
         cin >> A[i];
     }

     cout << " \nUn-Sorted Array: ";

     for(i=0;i<n;i++){
         cout << A[i];
     }

     merge_sort(A,0,n-1);

     cout << "\nSorted Array: ";

     for(i=0;i<n;i++){
         cout << A[i];

     }
     return 0;
 }

2 个答案:

答案 0 :(得分:0)

您的merge函数会忽略其参数lowmidhigh并使用全局变量lh,{{1程序启动时设置为零,从不设置非零。因此,它对一个空数组进行排序(或可能是可以想象的排序),并使其余数据保持未排序状态。 (仅仅是另一个不信任全局变量的理由。)

我还没有确认是否还有其他问题(可能有)。但是首先要注意你的函数参数会有所帮助。

如果您的编译器没有警告您有关未使用的参数,您要么没有将警告调高到足够高,要么需要更好的编译器。

答案 1 :(得分:0)

int merge(int A[], int low, int mid, int high){

    int A1[10];
    int A2[10];
    int n1, n2, i, j, k;

    n1=mid-low+1;//use parameter
    n2=high-mid;//ditto

    for (i=0; i<n1; i++)
        A1[i]=A[low+i];//ditto

    for (j=0; j<n2; j++)
        A2[j]=A[mid+j+1];//ditto


     A1[i]=9999;
     A2[j]=9999;//typo i -> j

     i=0;
     j=0;
     for(k=low; k<=high; k++){//k=1 typo and use parameter
        if (A1[i] <= A2[j])
            A[k]=A1[i++];
        else
            A[k]=A2[j++];
     }
     return 0;

}