现在的位置: 首页 > 综合 > 正文

排序算法:计数排序

2013年05月19日 ⁄ 综合 ⁄ 共 1732字 ⁄ 字号 评论关闭

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

排序算法要求:

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

运行结果:

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

抱歉!评论已关闭.