计数排序

     计数排序是一种非比较的排序算法,它的思想其实很简单,就是先开辟一块空间用来存放数据出现的次数,然后就要统计出数据出现的次数,并将其放在对应的位置下标上,最后我们可以根据统计的次数依次还原出来就有序了,如下图分析:


代码实现:

void CountSort(int* a,int n)
{
	assert(a);
	int max=a[0];
	int min=a[0];
	//1.先统计数据中的最大值和最小值,然后确定范围
	for(int i=0;i<n;++i)
	{
		if(a[i]>max)
			max=a[i];

		if(a[i]<min)
			min=a[i];
	}
	int range=max-min+1;
	int* count=new int[range];  //用来存放数据出现的次数
	memset(count,0,sizeof(int)*range);

	//2.遍历数据放在对应的位置
	for(int i=0;i<n;++i)
	{
		count[a[i]-min]++;
	}
	//3.将数据按统计的次数依次还原
	int index=0;
	for(int i=0;i<range;++i)
	{
		while(count[i]--)
		{
			a[index++]=i+min;
		}
	}
	delete[] count;
}

计数排序,在数据范围比较大或是数据太过分散的时候占用空间就很大,这种情况就不太适用,而且只能对无符号数进行排序(没有比较),但是它有一个很明显的优势是:在数据范围较集中时,排序效率是相当高的。

时间复杂度为O(N+范围),空间复杂度为O(范围)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值