这个合并排序代码有啥问题?

Posted

技术标签:

【中文标题】这个合并排序代码有啥问题?【英文标题】:what is wrong with this merge sort code?这个合并排序代码有什么问题? 【发布时间】:2016-03-28 02:35:37 【问题描述】:

我正在尝试使用迭代器编写合并排序来自学 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;

【问题讨论】:

【参考方案1】:

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

你可以每次都返回一个新的向量,或者这样做in place

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

  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;
        
  

【讨论】:

谢谢!这更有意义!

以上是关于这个合并排序代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改我的合并排序代码以从最大到最小排序

合并排序

合并两个排序的链表

LeetCode 23合并K个排序链表

向量下标超出范围 C++ 合并排序

合并排序 - 向量不排序