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

计数排序(count sort)

  • 真言

科技是第一生产力。

  • 引言

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

  • 思路

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

  • 实验

给1000,000个数据排序耗时如下
算法之排序 排序第六篇  计数排序(count sort)

  • 代码

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)

上一篇:Photoshop 一个逼真的玻璃灯泡


下一篇:photoshop利用纹理素材及图层样式制作个性的金色纹理字