今天学了排序算法,计数排序,特在此与大家分享一下,欢迎提出意见:
排序算法要求:
1,待排序的数据全部为正整数(暂定为n个)
2,待排序的数据的范围已经确定(暂定为1-k)
3,当n>k的时候,此排序算法的效率很高,时间复杂度为0(n),空间复杂度为0(k)
排序过程举例:
取一列数据 :3,2,4,2,5,1,3。可知n=7,k=5
3 2 4 2 5 1 3
表格1,数组名为A
排序步骤:
1,准备一个数组,数组的大小为k,数组的下标为1-k,初始化数组的元素为0
下标 1 2 3 4 5 元素的值 0 0 0 0 0
表格2,数组名为B
2,遍历表格1中的待排序的元素,从前向后。第一步:由于A[1]=3,将B[3]的元素增1;第二步,由于A[2]=2,将B[2]的元素增1;第三步,由于A[3]=4,将B[4]的元素增1,第四步A[4]=2,将B[2]的元素增1
此时表格的元素为下:
下标 1 2 3 4 5 元素的值 0 2 1 1 0
表格3,数组名为B
同理:继续进行第四步,第五步.....到数组A序列的最后一个元素,经过计算,此时数组B的元素如下:
下标 1 2 3 4 5 元素的值 1 2 2 1 1
表格4,数组名为B
3,对表格4的元素进行累加操作,数组B的每一个元素都是其前面的元素之和。为了实现这种效果,可以通过循环加法,B[2] = B[1]+B[2],B[3] = [B2]+B3],等等
只需要进行一遍循环,每一个元素都是它自己与它前一个元素的和,得到的数组B如下:
下标 1 2 3 4 5 元素的值 1 3 5 6 7
表格5,数组名为B
4,新建一个数组C,用来存放最终的排序好的数据
表格6,数组名为C
对表格1的元素从后向前遍历:
第一步由于A[7]=3,则寻找B[3]=5,于是将C的第5个位置存放A[7]=3,同时B[3]减1;
第二步,由于A[6]=1,则寻找B[1]=1,则将C的第一个位置放置A[6]=1,同时B[1]减1;
第三步,由于A[5]=5,寻找B[5]=7,则将C的第7个位置放置5,同时B[5]减1;
此时数组C的元素如下:
1 3 5
表格7,数组名为C
同理继续放置:
1 2 2 3 3 4 5
表格8,数组名为C
以下对每一步的时间复杂度进行分析:1, 0(k)
2, 0(n)3, 0(k)4, 0(n)以下为VS2008测试通过的源代码:
#include<iostream>
using namespace std;
#define n 7
#define k 5
int main()
{
int A[n+1] = {-1,3,2,4,2,5,1,3};
int B[k+1],C[n+1];
for(int i = 1; i <= k; ++i)
B[i] = 0;
for(int i = 1; i <= n; ++i)
B[A[i]] = B[A[i]] + 1;
for(int i = 2; i <= k; ++i)
B[i] = B[i-1] + B[i];
for(int i = 1; i <= n; ++i)
{
C[B[A[i]]] = A[i];
B[A[i]] = B[A[i]] - 1;
}
for(int i = 1; i <= n; ++i)
cout<<A[i]<<" ";
cout<<endl;
for(int i = 1; i <= n; ++i)
cout<<C[i]<<" ";
return 0;
}