这个合并排序代码出了什么问题

what is wrong with this merge sort code?

本文关键字:什么 问题 代码 合并 排序      更新时间:2023-10-16

我正试图使用迭代器编写合并排序来自学c++,但由于某种原因,这段代码正在编译,但结果没有排序。有人能找出它的毛病吗?在我未经训练的眼睛看来,这似乎很好。

typedef vector<int> vec_int;
typedef vector<int>::iterator vec_int_iter;
void merge_sort(vec_int& vec, vec_int_iter low, vec_int_iter high){
   if(low < high){
      vec_int_iter med = low + (high-low)/2 ;
      merge_sort(vec, low, med);
      merge_sort(vec, med+1, high);
      arrange(vec, low, med, high);
      }
}
void arrange(vec_int& vec, vec_int_iter low, vec_int_iter med, vec_int_iter high){
   vec_int_iter left = low, right = med+1;
   vec_int temp;
   temp.clear();
   vec_int_iter it = temp.begin();
   while(left <= med and right <= high)
      temp.push_back( (*left < *right)? *left++ : *right++ );
   while(left <= med)
      temp.push_back( *left++ );
   while(right <= high)
      temp.push_back( *right++ );
   vec = temp;
}

错误的代码是vec = temp,它将在合并的某个步骤中用临时向量替换原始向量。因为,每次排列,温度都只是从原点向量的低到高
然后原点向量变为子向量。

你可以每次返回一个新的矢量,或者在中进行

示例代码,更改排列功能:

  void arrange(vec_int& vec, vec_int_iter low, vec_int_iter med, vec_int_iter high){
     vec_int_iter left = low, right = med+1;
     vec_int temp;
     temp.clear();
     while(left <= med and right <= high)
        temp.push_back( (*left < *right)? *left++ : *right++ );
     while(left <= med)
        temp.push_back( *left++ );
     while(right <= high)
        temp.push_back( *right++ );
     vec_int_iter start = low;
     for(vec_int_iter t = temp.begin(); t <temp.end(); t++){
        *start++ = *t;
     }   
  }