排序算法:计数排序

 

 

今天学了排序算法,计数排序,特在此与大家分享一下,欢迎提出意见:

 

 

排序算法要求:

1,待排序的数据全部为正整数(暂定为n个)

2,待排序的数据的范围已经确定(暂定为1-k)

3,当n>k的时候,此排序算法的效率很高,时间复杂度为0(n),空间复杂度为0(k)

 

排序过程举例:

取一列数据 :3,2,4,2,5,1,3。可知n=7,k=5

 

3242513

表格1,数组名为A

排序步骤:

1,准备一个数组,数组的大小为k,数组的下标为1-k,初始化数组的元素为0

 

 

 

下标12345
元素的值00000

表格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

此时表格的元素为下:

 

 

下标12345
元素的值02110

表格3,数组名为B

 

同理:继续进行第四步,第五步.....到数组A序列的最后一个元素,经过计算,此时数组B的元素如下:

 

 

下标12345
元素的值12211

表格4,数组名为B

 

3,对表格4的元素进行累加操作,数组B的每一个元素都是其前面的元素之和。为了实现这种效果,可以通过循环加法,B[2] = B[1]+B[2],B[3] = [B2]+B3],等等

只需要进行一遍循环,每一个元素都是它自己与它前一个元素的和,得到的数组B如下:

 

 

下标12345
元素的值13567

表格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

同理继续放置:

 

1223345

表格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;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值