计数排序(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;
}
}
算法之排序 排序第六篇 计数排序(count sort)