您的位置:首页 > 理论基础 > 数据结构算法

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

2017-02-11 13:24 134 查看
计数排序和基数排序,名称虽然相似,但是原理完全不一样。计数排序比较适用于元素偏小的序列,比如元素在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: