计数排序

    计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。

原理

    统计一个数序列中小于某个元素a的个数为n,则直接把该元素a放到第n+1个位置上。当然当过有几个元素相同时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数

计数排序的一般实现:

void countSort(int src[],int dest[],int len,int k)
{
	/* len is the length of src .
	elements in src are all smaller than k. */
	int i;
	int *C = (int*)malloc(sizeof(int)*k);
	for(i=0;i<k;i++)
		C[i] = 0;
	for(i=0;i<len;i++)
		C[src[i]]++;
	for(i=1;i<k;i++)
		/* i start from 1. */
		C[i] = C[i] + C[i-1];
	for(i=len-1;i>=0;i--){
		/*i start from len - 1. we could see the sorting is stable. */
		dest[C[src[i]]-1] = src[i];/* C[src[i]]-1*/
		C[src[i]] -= 1;
	}
	free(C);
}
测试数据:

2   5   3   0   2   3   0   3 (src)  
2   2   4   7   7   8 (C)  
0   0   2   2   3   3   3   5  (dest)

计数排序是稳定的哟。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值