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

计数排序(count sort)

  • 真言

科技是第一生产力。

  • 引言

快过年了,祝大家新年快乐,在过年期间,博客也会一直出新。

  • 思路

count sort很牛叉,以空间换时间
时间复杂度O(n)
空间复杂度O(max+n)max为要排序的数据中的最大值。
举个例子说明思路吧,感觉很牛叉,一会你看程序结果就知道了,比那比较排序快多了。
源数据,如下
算法之排序 排序第六篇 计数排序(count sort)_第1张图片
利用辅助空间数组,记录每个元素的个数
算法之排序 排序第六篇 计数排序(count sort)_第2张图片
利用元素的个数统计出每个元素在排好序的数据中的位置。
算法之排序 排序第六篇 计数排序(count sort)_第3张图片
预处理以后如下
算法之排序 排序第六篇 计数排序(count sort)_第4张图片
源数据每个元素从后往前处理,把其放在应该放的位置。
1
算法之排序 排序第六篇 计数排序(count sort)_第5张图片
2
算法之排序 排序第六篇 计数排序(count sort)_第6张图片
3
算法之排序 排序第六篇 计数排序(count sort)_第7张图片
4
算法之排序 排序第六篇 计数排序(count sort)_第8张图片
5
算法之排序 排序第六篇 计数排序(count sort)_第9张图片
6
算法之排序 排序第六篇 计数排序(count sort)_第10张图片
7
算法之排序 排序第六篇 计数排序(count sort)_第11张图片
8
算法之排序 排序第六篇 计数排序(count sort)_第12张图片
ok,over.

  • 实验

给1000,000个数据排序耗时如下

  • 代码

test.cpp
#include 
#include 
#include 
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 0)
	{
		int Max = data[0];
		for(int i = 0;iMax)
				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"<


你可能感兴趣的:(面试题,C++,dance,with,algorithm)