合并排序实施无法正常工作

Merge Sort implementation not working as expected

本文关键字:工作 常工作 排序 施无法 合并      更新时间:2023-10-16

我一直在尝试实现合并排序;但是实现以某种方式不正确 - 输出包含不是原始数组的一部分的值。我尝试将其与其他人的实现(工作(进行比较,但似乎找不到错误。

代码是: -

#include <iostream>
using namespace std;
void Merge (int A[], int lo, int hi, int mid){
    int i = lo;
    int k = 0;
    int j = mid+1;
    int R[hi-lo];
    while(i<=mid && j<=hi){
        if(A[i]<A[j]){
            R[k]=A[i];
            cout << A[i] << "; " << A[j] << "      " << i << "        " << j << endl;
            i++;
        }else {
            R[k]=A[j];
            cout << A[i] << "; " << A[j] << "      " << i << "        " << j << endl;
            j++;
        }k++;
    }
    while(i<=lo){
        R[k]=R[i];
        i++;k++;
    }
    while(j<=hi){
        R[k]=R[j];
        j++;k++;
    }
    int count =0;
    for(i=lo; i<hi; i++){
        A[i]=R[count];
        count++;
        cout << count << "    ;    " << i << "-/-/-/-/-/-/-" << flush;
    }
}
void mergeSort(int A[], int lo, int hi){
    //if(hi-lo+1<2)return;
    if (lo<hi){
    int mid = (lo+hi)/2;
    mergeSort(A, lo, mid);
    mergeSort(A, mid+1, hi);
    Merge (A, lo, hi, mid);}
}
int main(){
    int A[] = {1,5,3,4,8,9,150,7,51,65};
    int hi = sizeof(A)/sizeof(int);
    cout << hi << endl;
    mergeSort(A,0, hi);
    cout << endl << endl << endl << endl;
    for(int i=0; i<=hi; i++){
        cout<<A[i]<< "; " << flush;
    }
    return 0;
}

我试图搜索类似的Q(s(,但找不到一个。

实现的问题是边界包含和错误的数组的混合。

首先,查看合并中循环的最后两个时,您做了: R[k]=R[i];当您表示R[k]=A[i];

在同一函数上,您的循环缺少迭代,循环保护应为 i<=hi而不是 i<hi

HI的初始化也是错误的,因为您将其初始化为元素的数量而不是最后一个索引,因此您应该减去-1。

也不知道您的打印代码在做什么,所以我发表了评论并添加了自己的印刷代码,我发现了更清楚的。

我纠正您的代码如下:

   #include <iostream>
using namespace std;
void Merge (int A[], int lo, int hi, int mid){
    int i = lo;
    int k = 0;
    int j = mid+1;
    int R[hi-lo];
    cout << "input" << endl;
    for(int i=lo; i<=mid; i++)
        cout << A[i] << " ";
    cout << endl;
    for(int i=mid+1; i<=hi; i++)
        cout << A[i] << " ";
    cout << endl;
    while(i<=mid && j<=hi){
        if(A[i]<A[j]){
            R[k]=A[i];
            //cout << A[i] << "; " << A[j] << "      " << i << "        " << j << endl;
            i++;
        }else {
            R[k]=A[j];
            //cout << A[i] << "; " << A[j] << "      " << i << "        " << j << endl;
            j++;
        }k++;
    }
    while(i<=mid){
        R[k]=A[i];
        i++;k++;
    }
    while(j<=hi){
        R[k]=A[j];
        j++;k++;
    }
    int count =0;
    for(i=lo; i<=hi; i++){
        A[i]=R[count];
        count++;
        //cout << count << "    ;    " << i << "-/-/-/-/-/-/-" << flush;
    }
    cout << "output:" << endl;
    for(int i=lo; i<=hi; i++)
        cout << A[i] << " ";
    cout << endl;
}
void mergeSort(int A[], int lo, int hi){
    //if(hi-lo+1<2)return;
    if (lo<hi){
    int mid = (lo+hi)/2;
    mergeSort(A, lo, mid);
    mergeSort(A, mid+1, hi);
    Merge (A, lo, hi, mid);}
}
int main(){
    int A[] = {1,5,3,4,8,9,150,7,51,65};
    int hi = sizeof(A)/sizeof(int) -1;
    cout << hi << endl;
    mergeSort(A,0, hi);
    cout << endl << endl << endl << endl;
    for(int i=0; i<=hi; i++){
        cout<<A[i]<< "; " << flush;
    }
    return 0;
}