一個O(n)複雜度的排序演算法
阿新 • • 發佈:2019-02-10
排序
排序的演算法很多,又各有優劣。如果已知輸入資料的範圍,且資料分佈比較均勻,下面將要介紹的這個演算法比較有效。一個數組有兩個資訊,它儲存的值以及值得索引,有時候我們只是用來儲存值,那麼另外的資訊就無用被浪費掉了。
思路
由於索引本身是能代表順序的,那麼利用它來簡化排序也是理所當然。假如我們輸入資料的範圍是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;
}