您的位置:首页 > 编程语言 > C语言/C++

算法之排序 排序第六篇 计数排序(count sort)

2014-01-13 23:28 302 查看

计数排序(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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题 c++
相关文章推荐