您的位置:首页 > 其它

STL算法之sort和stable_sort

2017-03-15 09:35 405 查看
1.stable_sort 和 sort的区别在于 前者作排序可以使原来的"相同"的值在序列中的相对位置不变

如 1 4 6 7 4' (4 和 4'值相等,加上' 表示是2个元素)
那么stable_sort能保证排序完 4 仍然在4' 前 也就是输出1 4 4' 6 7;但是sort 没有这个功能,算法不能保证这一点

2.在标准算法<algorithm>中的一部分算法 如果这个算法默认使用的是 < 运算符,那么这类算法通常提供一个重载版本,这个重载版本包括3个参数,而不是2个.新增的第三个参数是一个函数指针,这个函数指针指向的函数 就是用来代替默认的 < 运算符的.
也就是说如果容器中的2个元素 ,元素a和元素b,输入个这个新增的比较函数之后,函数返回true,那么a将会放在b前面,LZ给的例子里面这个比较函数能够用使长度大的排在前面.

同时,使用了stable_sort能够保证2个长度相同的元素按原顺序排列


//大部分容器适用、不适用于list容器

sort(b,e)

sort(b,e,p)

stable_sort(b,e)

stable_sort(b,e,p)



#include<iostream>  

#include<cstdio>  

#include<string>  

#include<vector>  

#include<list>  

#include<deque>  

#include<algorithm>  

using namespace std;  

  

/***************************************** 

//大部分容器适用、不适用于list容器 

sort(b,e) 

sort(b,e,p) 

stable_sort(b,e) 

stable_sort(b,e,p) 

*****************************************/  

/**---------------------------------------------------------------------------------- 

注意:不适用于list容器,list有成员函数sort() 

----------------------------------------------------------------------------------**/  

/************************************************************************************* 

std::sort                     所有排序容器适用                           algorithm 

-------------------------------------------------------------------------------------- 

template <class RandomAccessIterator> 

  void sort ( RandomAccessIterator first, RandomAccessIterator last ); 

 

template <class RandomAccessIterator, class Compare> 

  void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); 

//eg: 

 

*************************************************************************************/  

  

/************************************************************************************* 

std::stable_sort                     所有排序容器适用                       algorithm 

-------------------------------------------------------------------------------------- 

template <class RandomAccessIterator> 

  void stable_sort ( RandomAccessIterator first, RandomAccessIterator last ); 

 

template <class RandomAccessIterator, class Compare> 

  void stable_sort ( RandomAccessIterator first, RandomAccessIterator last, 

                     Compare comp ); 

//eg: 

 

*************************************************************************************/  

  

  

bool myfunction (int i,int j)  

{  

    return (i<j);  

}  

  

struct myclass  

{  

    bool operator() (int i,int j)  

    {  

        return (i<j);  

    }  

} myobject;  

bool compare_as_ints (double i,double j)  

{  

    return (int(i)<int(j));  

}  

  

int main ()  

{  

    int myints[] = {32,71,12,45,26,80,53,33};  

    vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33  

    vector<int>::iterator it;  

  

    // using default comparison (operator <):  

    sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33  

  

    // using function as comp  

    sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)  

  

    // using object as comp  

    sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)  

  

    // print out content:  

    cout << "myvector contains:";  

    for (it=myvector.begin(); it!=myvector.end(); ++it)  

        cout << " " << *it;  

  

    cout << endl;  

    /**---------------------------------------------------------------------------------------**/  

  

    double mydoubles[] = {3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58};  

  

    deque<double> mydeque;  

    deque<double>::iterator id;  

  

    mydeque.assign(mydoubles,mydoubles+8);  

  

    cout << "using default comparison:";  

    stable_sort (mydeque.begin(), mydeque.end());  

    for (id=mydeque.begin(); id!=mydeque.end(); ++id)  

        cout << " " << *id;  

  

    mydeque.assign(mydoubles,mydoubles+8);  

  

    cout << "\nusing 'compare_as_ints' :";  

    stable_sort (mydeque.begin(), mydeque.end(), compare_as_ints);  

    for (id=mydeque.begin(); id!=mydeque.end(); ++id)  

        cout << " " << *id;  

  

    cout << endl;  

  

    return 0;  

}  



[cpp] view
plain copy

myvector contains: 12 26 32 33 45 53 71 80  

using default comparison: 1.32 1.41 1.62 1.73 2.58 2.72 3.14 4.67  

using 'compare_as_ints' : 1.41 1.73 1.32 1.62 2.72 2.58 3.14 4.67  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STL算法 sort stable_sort