将排序代码与数组合并,陷入合并,只需要一点点修正

Merge Sort Code with array , stuck in merging, just need a little ammendment

本文关键字:合并 一点点 代码 排序 数组      更新时间:2023-10-16
 void merge(int *a1, int *a2, int *a3, int s1, int s2, int s3){
     s2 -=1;
     int track =0;
     s3-=1;
     int p2=0;
     int p3=0;
     while(p2<s2 && p3 <s3){
         if(a2[p2]<a3[p3])
             a1[track++]=a2[p2++];
         else
             a1[track++]=a3[p3++];
     }
     while(p2<s2) a1[track++]=a2[p2++];
     while(p3<s3) a1[track++]=a3[p3++];
 }

 void msort(int *array, int n){
     if(n<=1) return;
     int a1_size = n/2;
     int a2_size = n-n/2;
     int a1[n/2];
     int a2[n-n/2];
     for(int i=0;i<n/2;i++){
    a1[i] = array[i];
     }
     for(int i=0,j=n/2;j<n;i++,j++){
         a2[i] = array[j];
     }
     msort(a1, n/2);
     msort(a2, n-n/2);
     merge(array, a1, a2, n, a1_size, a2_size);
 }
 int main(){
     int a[]={1,2,1,2,3,94,5,67};
     msort(a,8);
     for(int i=0;i<8;i++)
         cout << a[i] << endl;
}

这是我的代码,我希望它会返回一个排序的数组。我知道问题是传递要合并的数组地址会修改数组内的数据,从而影响结果。我尝试了很长时间,但仍然不知道如何修正它。有人可以给我提示或帮助吗?

问题出在s2 -= 1s3 -= 1语句中。你为什么要这样做?从零开始index迭代数组的标准习惯用法是在index < length时计数,而不是在index < length-1时计数。

其他一些注意事项:

  • 您分配了大量额外的内存(n*log(n( ints(,这些内存大部分时间都处于未使用状态。只需要在 merge 内部分配,这样最多可以随时分配n int。
  • 学习使用 std::vector 和/或迭代器范围而不是 C 样式数组