我无法让他的Merge Sort实现正确。调试它

时间:2017-04-18 05:10:47

标签: c++ mergesort

这里我试图使用辅助数组实现Merge排序,类似于Bob Sedgewick的实现,Algorithms类,Princeton(Coursera)。 但我无法做到这一点。它不对数组进行排序。错误在哪里?

#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上。

1 个答案:

答案 0 :(得分:1)

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

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++];
    }

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