您的位置:首页 > 其它

排序算法(五)之计数排序

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++代码

#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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 c 存储 null