这里我试图使用辅助数组实现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上。
答案 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++];
}
休息将保持不变。 感谢您的评论,这确实有所帮助。 : - )