[草稿]std::sort

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   使用   ar   for   

本章描述C++泛型演算法sort的設計和使用。

個人認為,排序相關的泛型演算法是C++中相對比較複雜的部分。

sort的內部實現並不是固定的,在不同版本的C++中,採用的排序演算法可能是不同的,但是最壞時間複雜度必須是O(n log n)。

GNU Standard C++ library採用了三步混合排序方式:首先使用內省排序(本身採用快速排序和堆排序的混合),然後使用插入排序。

參見:http://en.wikipedia.org/wiki/Sort_(C%2B%2B)

(關於內省排序,參見:http://zh.wikipedia.org/wiki/%E5%86%85%E7%9C%81%E6%8E%92%E5%BA%8F)

或許是因為實現方法不固定,C++官方網站也並沒有提供相關的實現方法。

我們先來看看C++官方網站上對sort的描述

http://www.cplusplus.com/reference/algorithm/sort/

(註:以下內容是我對C++官方網站上內容的理解,不準確的地方請見諒)

  • sort函數的聲明:

sort函數有兩種形式,

一種是預設採用operator<進行比較的形式:

template <class RandomAccessIterator>void sort (RandomAccessIterator first, RandomAccessIterator last);

一種是採用自訂比較方式的形式:

template <class RandomAccessIterator, class Compare>void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

所以,如果你想對自訂類型的一組資料將進行排序,那麼你有兩種選擇:1. 重載operator<; 2.採用第二種形式。

  • sort函數的作用:

對[first,last)序列中的元素進行排序(如果採用上邊的第一種方式,則按降序排列)。

非穩定排序,即 相等的兩個元素,在排序之後並不能保證其原來的先後循序。(如果需要穩定排序,請採用stable_sort)。

其他內容(還不夠詳細):

  • sort函數的時間複雜度:

最差時間複雜度 O(n log n)

  • sort函數的排序方式:

非穩定排序(如果需要穩定排序,請採用stable_sort)。

不同版本的C++中,sort採用的排序演算法可能是不同的。GNU採用內省排序和插入排序的混合方式。

以下是我寫得一個簡單的例子

#include <algorithm>#include <iostream>#include <vector>using std::cout;using std::endl;using std::vector;class Whatever{public:    Whatever(int size, char name)        : mSize(size), mName(name)    {}    int getSize() { return mSize; }    char getName() { return mName; }    bool operator< (const Whatever& what) const    {        return (this->mSize < what.mSize);    }private:    int mSize;    char mName;};void print(vector<int> vec){    for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)    {        cout << *iter << ‘ ‘;    }    cout << endl;}void print(vector<Whatever> vec){    for (vector<Whatever>::iterator iter = vec.begin(); iter != vec.end(); iter++)    {        cout << iter->getSize() << iter->getName() << ‘ ‘;    }    cout << endl;}bool compare(int i, int j){    return (i > j);}bool compareWhat(Whatever i, Whatever j){    return (i < j);}int main(void){    int vecVal[] = {12, 10, 13, 15, 20, 18, 11};    vector<int> vec(vecVal, vecVal+7);    sort(vec.begin(), vec.end());    print(vec);    sort(vec.begin(), vec.end(), compare);    print(vec);    vector<Whatever> vecWhat;    for (int i = 0; i < 100; i++)    {        Whatever what(rand()%50, char(97+rand()%25));        vecWhat.push_back(what);    }    print(vecWhat);    sort(vecWhat.begin(), vecWhat.end(), compareWhat);    print(vecWhat);    return 0;}

 

[草稿]std::sort

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.