夕拾-数据结构-计数排序

计数排序和基数排序,名称虽然相似,但是原理完全不一样。计数排序比较适用于元素偏小的序列,比如元素在1000之内,排序速度还是比较快的。时间复杂度为O(n)。

基本思想:假设数序列中小于等于元素a的个数为n,则直接把a放到第n个位置上。当存在几个相同的元素时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到Max之间的整数。

假设给定的数组元素a[i]都在100之内

(1)使用一个数组cnt[100]记录元素0~100出现的次数。

(2)逐步加数数组cnt[i]=cnt[i]+cnt[i-1],表示小于等于元素i的元素数目

(3)把元素a[i]映射到cnt中获得其最终排序的位置即pos=cnt[a[i]]

其代码实现如下所示:

#include <iostream>
#include <string>
using namespace std;
 
const int Max=128; //序列中可能出现的最大元素值 
int cnt[Max]; //用来记录序列中元素出现的次数

//n=序列元素个数,m=序列中最大的数(默认Max-1) 
void count_sort(int *a,int *r,int n,int m){
	for(int i=0;i<m;i++){
		cnt[i]=0; //计数器清0 
	}
	for(int i=0;i<n;i++){
		cnt[a[i]]++; //统计序列中元素出现的次数 
	}
	for(int i=1;i<m;i++){
		cnt[i]+=cnt[i-1]; //统计小于等于i的数目 
	}
	for(int i=n-1;i>=0;i--){ //逆序保证排序的稳定性 
		int pos=cnt[a[i]]; //获得元素在排序中的位置
		r[pos-1]=a[i]; //r的下标从0开始 ,因而pos-1
		cnt[a[i]]--; //当前元素累加计数-1,可能出现多个相同元素 
	} 
} 
 

int main(){
	//a表示测试数组,r为排序后的数组 
	int a[10]={2,5,3,0,2,31,0,3,120,66},r[10];
	count_sort(a,r,10,Max);
	for(int i=0;i<10;i++){
		cout<<r[i]<<" ";
	} 
	cout<<endl;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值