关于 stable_sort

本文通过示例解释了stable_sort()和sort()的区别,特别是在使用自定义比较函数时如何保持元素的原始顺序。通过C++代码演示了stable_sort()如何在排序过程中保持相等元素的相对位置不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



关于stable_sort()和sort()的区别:

今天遇到个问题,关于sort函数的.之前一直以为,sort是不稳定的,但是添加了比较函数的sort是稳定的,然而今天发现这个观点是错的.下面纯粹转载别人的博客,用于记录


你发现有sort和stable_sort,还有 partition 和stable_partition, 感到奇怪吧。其中的区别是,带有stable的函数可保证相等元素的原本相对次序在排序后保持不变。或许你会问,既然相等,你还管他相对位置呢,也分不清 楚谁是谁了?这里需要弄清楚一个问题,这里的相等,是指你提供的函数表示两个元素相等,并不一定是一摸一样的元素。

例如,如果你写一个比较函数:

bool less_len(const string &str1, const string &str2)
{
        return str1.length() < str2.length();
}

此时,“apple” 和 “winter” 就是相等的,如果在”apple” 出现在”winter”前面,用带stable的函数排序后,他们的次序一定不变,如果你使用的是不带”stable”的函数排序,那么排序完 后,”Winter”有可能在”apple”的前面。

举例说明:

  1. <strong>#include <vector>  
  2.  #include <iostream>  
  3.  #include <algorithm>  
  4.    
  5.  using namespace std;  
  6.    
  7.  bool comp_as_int(double i, double j)  
  8.  {  
  9.      return (int(i)<int(j));  
  10.  }  
  11.    
  12.    
  13.  int main()  
  14.  {  
  15.      double mydoubles[] = {3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58};  
  16.      vector<double> v;  
  17.      vector<double>::iterator it;  
  18.    
  19.      v.assign(mydoubles, mydoubles + 8);  
  20.        
  21.      cout<<”use default comparison:”<<endl;  
  22.      stable_sort(v.begin(), v.end());  
  23.    
  24.      for(it = v.begin(); it != v.end(); it++)  
  25.          cout<<*it<<” ”;  
  26.      cout<<endl;  
  27.    
  28.      cout<<”use selfdefined comparison function comp_as_int():”<<endl;  
  29.      v.assign(mydoubles, mydoubles + 8);  
  30.      stable_sort(v.begin(), v.end(), comp_as_int);  
  31.        
  32.      for(it = v.begin(); it != v.end(); it++)  
  33.          cout<<*it<<” ”;  
  34.      cout<<endl;  
  35.      cout<<”if it is not sorted with stable_sort(), the sequence of all elements between 1 and 2 will be set randomly…”<<endl;  
  36.    
  37.      return 0;  
  38.  }</strong>  
<strong>#include <vector>
 #include <iostream>
 #include <algorithm>

 using namespace std;

 bool comp_as_int(double i, double j)
 {
     return (int(i)<int(j));
 }


 int main()
 {
     double mydoubles[] = {3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58};
     vector<double> v;
     vector<double>::iterator it;

     v.assign(mydoubles, mydoubles + 8);

     cout<<"use default comparison:"<<endl;
     stable_sort(v.begin(), v.end());

     for(it = v.begin(); it != v.end(); it++)
         cout<<*it<<" ";
     cout<<endl;

     cout<<"use selfdefined comparison function comp_as_int():"<<endl;
     v.assign(mydoubles, mydoubles + 8);
     stable_sort(v.begin(), v.end(), comp_as_int);

     for(it = v.begin(); it != v.end(); it++)
         cout<<*it<<" ";
     cout<<endl;
     cout<<"if it is not sorted with stable_sort(), the sequence of all elements between 1 and 2 will be set randomly..."<<endl;

     return 0;
 }</strong>
输出结果:

1 use default comparison:
2 1.32 1.41 1.62 1.73 2.58 2.72 3.14 4.67
3 use selfdefined comparison function comp_as_int():
4 1.41 1.73 1.32 1.62 2.72 2.58 3.14 4.67
5 if it is not sorted with stable_sort(), the sequence of all elements between 1 and 2 will be set randomly...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值