排序算法(五)之计数排序
来源:互联网 发布:互联网运营 知乎 编辑:程序博客网 时间:2024/05/22 11:48
计数排序假设n个输入元素中每一个都是介于o到k之间的整数。当k=O(n)时,计数排序的运行时间是Θ(n)。
基本思想是对每一个输入元素x,确定出小于x的元素个数,有了这个信息之后,就可以把x直接放在它在最终输出数组中的位置上,例如,有8个元素小于x,那么x就属于第9个输出位置。当有几个元素相同的时候,需要略作修改,不能把它们放在同一个输出位置上。
我们假定输入数组为A[1..n],目标数组为B[1..n],临时存储区C[1..n]。
COUNTING-SORT(A,B,k)
1 for i = 0 to k
2 do C[i] = 0
3 for j = 1 to length[A]
4 do C[A[j]] = C[A[j]] +1 //C[i]包含了等于i的元素个数
5 for i = 1 to k
6 do C[i] = C[i-1]+C[i] //C[i]包含了小于或等于i的元素个数
7 for j =length[A] downto 1
8 do B[C[A[j]]] = A[j]
9 C[A[j]] = C[A[j]] - 1
因为每一个元素不一定是不一样的,所以每当吧一个A[j]放入到B中,就应该减少C[A[j]] 的值,就会使下一个其值等于A[j]的输入元素直接进入到B中A[j]的前一个位置上。1~2行所花时间为Θ(k),3~4行为Θ(n),6~7行Θ(k),行7~9为Θ(n),总的时间为Θ(n+k),实践中,当k = O(n)时,我们常常用计数排序,这个时候运行时间是
Θ(n)。
计数排序是稳定的:具有相同值的元素在输出数组中的相对次序与它们再输入数组中的次序相同。
C++代码
#include <iostream>using namespace std;void Counting_Sort(int *A,int *B,int k,int length){ //数组A为输入元素数组,数组B为输出元素数组,A中所有元素<=k int C[length+1]; for(int i=0; i<=k; i++) //初始化临时存储数组C C[i]=0; for(int j=1; j<=length; j++) //C[i] == 元素i出现的个数 C[A[j]]++; for(int i=1; i<=k; i++) //C[i] == 小于或等于元素i的个数 C[i]=C[i-1]+C[i]; //根据C[i]给出元素i的位置,把i放入B中。 //防止相同元素排到同一个位置上,C[i]要减1 //这样子相同元素i就会被排到前一个位置上 for(int j=1; j<=length; j++) { B[C[A[j]]]=A[j]; C[A[j]]--; }}int main(){ int A[10]= {NULL,4,2,3,1,0,0,2,3,1}; int B[10]; int k=4; Counting_Sort(A,B,k,9); for(int i=1; i<=9; i++) cout<<B[i]<<" "; cout<<endl; return 0;}
- 排序算法(五)之计数排序
- 排序算法(五)-- 线性时间排序之计数排序
- 排序算法之计数排序
- 排序算法之计数排序
- 排序算法之计数排序
- 排序算法之计数排序
- 排序算法之计数排序
- 排序算法之计数排序
- 排序算法之计数排序
- 排序算法之计数排序
- 排序算法之计数排序
- 计数排序—《算法导论》学习笔记之五
- 【数据结构与算法】内部排序之五:计数排序、基数排序和桶排序(含完整源码)
- 【数据结构与算法】内部排序之五:计数排序、基数排序和桶排序(含完整源码)
- 基础算法系列(九)排序算法之计数排序
- 排序算法(五):计数排序与非比较排序
- 算法学习之计数排序
- 算法笔记之 计数排序
- 堆和栈在内存分配方面有什么不同?
- 开源文献管理软件Mendeley
- Activity生命周期
- Result Type(struts.xml配置)
- MySQL Query Profile 简单使用
- 排序算法(五)之计数排序
- 手动建立Struts2应用
- 贝叶斯网络的应用
- 循环队列的实现
- vim的入门
- 解读Content Provider之二
- 基于linux 的socket UDP编程例程
- 申请Android开发者账号
- Linux环境下动态库的生成和使用 (.so文件)