1. 程式人生 > >一個O(n)複雜度的排序演算法

一個O(n)複雜度的排序演算法

排序

排序的演算法很多,又各有優劣。如果已知輸入資料的範圍,且資料分佈比較均勻,下面將要介紹的這個演算法比較有效。一個數組有兩個資訊,它儲存的值以及值得索引,有時候我們只是用來儲存值,那麼另外的資訊就無用被浪費掉了。

思路

由於索引本身是能代表順序的,那麼利用它來簡化排序也是理所當然。假如我們輸入資料的範圍是0~99,輸入資料的規模N不知。因為只有範圍只有100,所以我們只需要建立一個100個元素的陣列即可,然後對應的索引記錄元素出現的次數,我們就可以排除輸入資料的順序(以下程式碼均使用c++11規範)。
以上為例,我們要對vector vec{13,34,25,78,34,25,39,67,25,12,13}進行排序。建立一個int book

100;

for(int i = 0; i <vec.size(); ++i)
    book[vec(i)] += 1;

最後輸出就是,對應的值是什麼就輸出幾次。所以

for(int i =0 ; i < 100; ++i)
{
    for(int j = 0; j < vec[i]; ++j )
        cout << i << " ";
}
結果就是12, 13,13,25,25,25,34,34,39,67,78.這種排序方式叫做桶排序。這裡的桶排序改進方式還有很多。
sort.cpp:
#include <iostream>
/* *input 是需要排序的資料來源 *N是需要排序的資料規模大小,M是資料的上限 *返回的是排序結果 */ template <class T> T* sort(T* input, int N, int M) { T* output = new T[M](); for (int i = 0; i < N; i++) output[input[i]] += 1; return output; } //寫一個main函式測試 int main() { int input[10] = {23, 25, 24, 67, 34, 23, 67, 94,25
, 23}; int* output = sort(input, 10, 100); for(int i = 0; i < 100; i++) { for (int j = 0; j < output[i]; ++j) std::cout << i << " "; } return 0; }