您的位置:首页 > 其它

算法导论-排序(四)计数排序(线性时间排序)

2014-09-27 21:01 218 查看

目录

1、计数排序介绍

2、流程图

3、代码实现

4、性能分析

5、参考资料

内容

1、计数排序介绍

什么是计数排序?

计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为θ(nlgn); 而计数排序不需要对数进行比较就可以进行排序;很神奇吧,只需要对待排序数组进行遍历就可以排序,效率为Θ(n)。。哈哈,那么神奇,下面开讲!!!!

限制:计数排序只能对非负整数(0,1,2,3...N)进行排序

排序思想:计数排序的基本思想就是对每一个输入元素 x,确定出小于 x 的元素个数。有了这一信息,就可以把 x 直接放到它在最终输出数组中的位置上。例如:有 10 个年龄不同的人,统计出有 8 个人的年龄比 A 小,那 A 的年龄就排在第 9 位,用这个方法可以得到其他每个人的位置,也就排好了序。

2、流程图

排序算法步骤:

1)统计数组中每个值为 X 的元素出现的次数,存入数组 C 的第X 项

2)累加元素出现次数(计算不超过 X包括X 的元素的个数)

3) 将元素X依次放入到适当的位置

排序伪码:

CountSort(A,n,k) //A-待排序数组;n-排序数组元素个数;k-大于等于待排序数组元素最大值的某个整数

步骤一流程图 1)统计数组中每个值为 X 的元素出现的次数,存入数组 C 的第X 项



步骤二 流程图 2)累加元素出现次数(计算不超过 X包括X 的元素的个数)



步骤三流程图 3)将元素X依次放入到适当的位置



3、代码实现(c++)

#include <iostream>
#include <vector>
#include <time.h>
using namespace std;

#define  N 10   //排序数组大小
#define  K 100   //排序数组范围0~K

void CountSort(vector<int> &A)
{
//找出待排序数组最大、最小值
int min,max;
min=max=A[0];
for (int i=1;i<A.size();i++)
{
if (A[i]<min) min=A[i];
else if (A[i]>max) max=A[i];
}
//定义数组B存放排好的数
vector<int> B(A.size());
//定义数组C,大小为(max-min+1),C[i]为A中值为i的个数
vector<int> C(max-min+1);
for (int i=0;i<max-min+1;i++) C[i]=0;//初始为0
for(int i=0;i<A.size();i++) C[A[i]-min]++;//计数
for (int i=1;i<max-min+1;i++) C[i]+=C[i-1];//累加
for (int i=A.size()-1;i>=0;i--)
{
B[C[A[i]-min]-1]=A[i];//A中值倒序取出放到B中合适位置,并在C计数中减1
//因数组下标从0开始,所以减1
C[A[i]-min]--;
}
A.assign(B.begin(),B.end());//B赋给A
}
////打印数组
void print_element(vector<int> A)
{
int len=A.size();
for (int i=0;i<len;i++)
{
std::cout<<A[i]<<" ";
}
std::cout<<std::endl;
}
// 随机参数排序数组,产生数组范围0~k的整数
void Random(vector<int> &a,int n,int k)
{
int i=0;
srand( (unsigned)time( NULL ) );
while(i<n)
{
a[i++]=rand()%k;
}
}

int main()
{
vector<int > vec_int(N);
Random(vec_int,N,K);
cout<<"源数组: ";
print_element(vec_int);
CountSort(vec_int);
cout<<"以排序数组: ";
print_element(vec_int);

system("PAUSE");
return 0;
}


4、性能分析

分析性能好的快速排序和本节介绍的计数排序的效率【排序数组取值为0~100的整数,数组大小分别取100,1000,10000,100000测试】

数组大小N快速排序(ms)计数排序(ms)
1000.1530120.236982
10006.007594.61228
1000058.442216.0187
1000004176.58169.768
分析:当数组元素个数较大时,计数排序效率相当高!

注意:当排序数组元素个数较少时效率会降低,并且数组范围较大时内存消耗会[b]相对增多。[/b]

何时使用计数排序:

结: 1)待排序数组为非负整数

2) and 数组范围小,元素个数较多

5、参考资料

【1】http://blog.csdn.net/xyd0512/article/details/8261816

【2】/article/4809945.html

【3】/article/6125622.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: