程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [草稿]std::sort,草稿stdsort

[草稿]std::sort,草稿stdsort

編輯:C++入門知識

[草稿]std::sort,草稿stdsort


本章描述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;
}

 


sort前為何要std::

因為sort函數是std命名空間下的成員
就像你用cout除了#include <iostream> 以外還必須寫std::cout或者using std::cout或者完全using namespace std一樣,必須使用相應的命名空間才行。
 

sort前為何要std::

sort函數實在std名字空間裡的,有兩種方式
一種是在前面說明:using namespace std;則可以直接調用sort函數
另一種就是直接寫全,std::sort.
名字空間主要是為了防止函數名字和類型均一致,發生沖突。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved