计数排序(count sort)
- 真言
科技是第一生产力。
- 引言
快过年了,祝大家新年快乐,在过年期间,博客也会一直出新。
- 思路
count sort很牛叉,以空间换时间时间复杂度O(n)空间复杂度O(max+n)max为要排序的数据中的最大值。举个例子说明思路吧,感觉很牛叉,一会你看程序结果就知道了,比那比较排序快多了。源数据,如下
利用辅助空间数组,记录每个元素的个数
利用元素的个数统计出每个元素在排好序的数据中的位置。
预处理以后如下
源数据每个元素从后往前处理,把其放在应该放的位置。1
2
3
4
5
6
7
8
ok,over.
- 实验
给1000,000个数据排序耗时如下
- 代码
test.cpp#include <iostream> #include <Windows.h> #include <ctime> using namespace std ; // count sort int * Count_sort(int *data,const int length); int const size = 1000000 ; int main( ) { DWORD s,e; int * data = new int[size]; int * result; for(int i = 0; i<size; i++) { data[i] = rand(); } s = GetTickCount(); result = Count_sort(data,size); e = GetTickCount(); //for(int i = 0; i<size; i++) //{ // cout<<data[i]<<" "; //} //cout<<endl; //for(int i = 0; i<size; i++) //{ // cout<<result[i]<<endl; //} cout<<"Count_sort cost "<<e-s<<" 毫秒"<<endl; system("pause"); return 0; } // Count_sort int * Count_sort(int *data,const int length) { if(data != NULL && length > 0) { int Max = data[0]; for(int i = 0;i<length;i++) if(data[i]>Max) Max = data[i]; int * Hash = new int[Max+1]; int * result = new int[length]; for(int i=0; i <= Max; i++) { Hash[i] = 0; } for(int i=0;i < length;i++) { Hash[data[i]]++; } for(int i = 0; i < Max; i++) { Hash[i+1] = Hash[i] + Hash[i+1]; } for(int i = length-1;i >= 0;i--) { result[ Hash[ data[i] ] -1] = data[i] ; Hash[ data[i] ] = Hash[ data[i] ] - 1 ; } return result ; } else { cout<<"exception of input Count_sort"<<endl; return NULL; } }