我无法正确实现他的合并排序。调试它

I can't get his implementation of Merge Sort right. Debug it

本文关键字:排序 合并 调试 实现      更新时间:2023-10-16

在这里,我正在尝试使用辅助数组实现合并排序,类似于普林斯顿(Coursera(算法类的Bob Sedgewick的实现。但是我不能做这件事。它不会对数组进行排序。错误在哪里?

#include <iostream>
void MergeArr(int *first_arr,int lo, int mid, int hi){
    int i, j, k;
    int *aux_arr = new int[hi - lo + 1];
    for(i = lo;i <= hi;i++){
        aux_arr[i] = first_arr[i];
    }
    i = lo, j = mid + 1;
    for(k = lo;k <= hi;k++){
        if(i > mid){
            first_arr[k] = aux_arr[j];
            j++;
        }
        else if(j > hi){
            first_arr[k] = aux_arr[i];
            i++;
        }
        else if(aux_arr[i] < aux_arr[j]){
            first_arr[k] = aux_arr[i];
            i++;
        }
        else{
            first_arr[k] = aux_arr[j];
            j++;
        }
        k++;
    }
    delete(aux_arr);
}
void SortArr(int *main_arr, int lo_place, int hi_place){
    if(lo_place >= hi_place)
        return;
    int mid = lo_place + (hi_place - lo_place)/2;
    SortArr(main_arr, lo_place, mid);
    SortArr(main_arr, mid + 1, hi_place);
    MergeArr(main_arr,lo_place, mid, hi_place);
}
void display(int *show_arr, int show_size){
    cout<<"nThe array: ";
    for(int i = 0;i < show_size;i++)
        cout<<show_arr[i]<<" ";
    cout<<"n";
}
int main(){
int len_arr;
cout<<"nEnter the size: ";
cin>>len_arr;
int *arr = new int[len_arr];
cout<<"nEnter the elements: ";
for(int i = 0;i < len_arr;i++)
    cin>>arr[i];
display(arr, len_arr);
SortArr(arr, 0, len_arr - 1);
cout<<"nAfter sorting the array: ";
display(arr, len_arr);

}

这是输出:输入大小:4
输入元素:4 3 2 1
阵列:4 3 2 1
对数组进行排序之后:
阵列:1 3 1 1

将感谢任何帮助。r。

我得到了它:-)
在合并函数中将主数组复制到辅助数组中时,索引中存在错误。

int size = hi - lo + 1;
    int *aux_arr = new int[size];
    for(i = 0, j = lo;i <= size;i++){
        aux_arr[i] = first_arr[j++];
    }

这是带有更正的代码。同样,随着辅助阵列索引从0到大小,我必须在最终合并循环中更改索引

i = 0, j = mid - lo + 1;
    for(k = lo;k <= hi;k++){
        if(i > mid - lo) first_arr[k] = aux_arr[j++];
        else if(j > hi - lo) first_arr[k] = aux_arr[i++];
        else if(aux_arr[i] < aux_arr[j]) first_arr[k] = aux_arr[i++];
        else first_arr[k] = aux_arr[j++];
    }

休息将保持不变。感谢您的评论,这确实有所帮助。: - (