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

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值