9 计数排序

计数排序是一个类似于桶排序的排序算法,其优势是对已知数量范围的数组进行排序。它创建一个长度为这个数据范围的数组C,C中每个元素记录要排序数组中对应记录的出现次数。非原址排序。

(1)思路:

计数排序算法的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。

(2)复杂度分析:

(2.1)时间复杂度:   

         平均情况: O(n)。

(2.2)空间复杂度:

         O(n)。

(3)稳定性:

         计数排序是稳定的。注意从后向前入桶。

代码片段:

#include <stdio.h>
#define SIZE 8

void count_sort(int* A,int* B,int len,int k);

int main()
{
    int A[SIZE]={2,5,3,0,2,3,0,3},B[SIZE];
    count_sort(A, B, SIZE, 5);		//5:数组元素最大值
    return 0;
}

void count_sort(int* A,int* B,int len,int k)
{
	const int C_len=9;		//k+1
	int C[C_len];
	int i,value,pos;
	for(i=0;i<=k;i++)		//置0
	{
		C[i]=0;
	}
	for(i=0;i<len;i++)		//统计各个桶中元素的个数
	{
		C[A[i]]++;
	}
	for(i=1;i<=k;i++)		//count[i]表示桶的右边界索引	
	{
		C[i]=C[i]+C[i-1];	
	}
	for(i=len-1;i>=0;i--)	//把数据依次装入桶B[],从后向前入桶保证计数排序稳定性
	{
		value=A[i];
		pos=C[value];
		B[pos-1]=value;
		C[value]--;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值