首页 > 其他 > 详细

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

时间:2014-01-21 09:47:41      阅读:590      评论:0      收藏:0      [点我收藏+]

计数排序(count sort)

  • 真言

科技是第一生产力。

  • 引言

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

  • 思路

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

  • 实验

给1000,000个数据排序耗时如下
bubuko.com,布布扣

  • 代码

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)

原文:http://blog.csdn.net/cqs_experiment/article/details/18238621

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!