夕拾-数据结构-计数排序
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]]
其代码实现如下所示:
基本思想:假设数序列中小于等于元素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; }
相关文章推荐
- 数据结构例程——简单的计数排序
- 【数据结构】非比较排序的算法实现(包括计数排序、计数排序)
- scala数据结构和算法-10-计数排序
- 算法与数据结构-常用排序算法总结2-计数排序
- 【数据结构】非比较排序--计数排序和基数排序
- [数据结构]计数排序
- C数据结构---计数排序实现
- (数据结构)非比较排序-计数排序、基数排序的分析与实现
- Python实现各类数据结构和算法---计数排序
- 【数据结构】中的计数排序(CountSort)
- 【数据结构】非比较排序的算法实现(包括计数排序、计数排序)
- 数据结构_计数排序
- 数据结构-计数排序
- 【数据结构】非比较排序的算法实现(包括计数排序、计数排序)
- 数据结构——计数排序
- [数据结构]计数排序
- 【数据结构】计数排序
- 数据结构 28 排序 计数排序 基数排序 桶排序
- 【数据结构】非比较排序算法(实现计数排序和基数排序)
- 【数据结构】非比较排序算法(实现计数排序和基数排序)