排序算法(五)之计数排序
2011-12-25 21:04
316 查看
计数排序假设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++代码
基本思想是对每一个输入元素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; }
相关文章推荐
- 排序算法系列:计数排序(Counting sort)(C语言)
- 排序算法-计数排序
- 排序算法总结(一)计数排序
- 算法与数据结构-常用排序算法总结2-计数排序
- 【排序算法】:计数排序
- 排序算法系列十(计数排序)
- 排序算法之线性排序(计数排序和桶排序)--Java语言
- 排序算法之计数排序
- 9种排序算法性能之比较之----计数排序
- 排序算法大集锦_线性时间_计数排序
- 小学生图解排序算法:⑧计数排序
- 三种线性的非基于比较的排序算法:计数排序、桶排序与基数排序
- 排序算法的时间复杂度以及空间复杂度 计数排序
- 排序算法之计数排序
- 排序算法(计数排序,基数排序,桶排序)
- 排序算法(六)非比较排序----计数排序和基数排序
- 排序算法_计数排序
- 排序算法之计数排序、基数排序和桶排序
- 号称效率为O(n)的排序算法-----计数排序
- 排序算法:计数排序