计数排序、基数排序(略)、桶排序(略)

一、计数排序

【算法原理】对于给定的自然数序列,求出记录i的个数c[i]。举例说明:待排序记录为{1,2,1,3,2},则c[1]=2,c[2]=2,c[3]=1,则第1~c[1]位置的元素为1,第c[1]+1~c[2]位置的元素为2,第c[2]+1~c[3]位置的元素为3。

数组c的长度是记录的数据范围。

计数排序是线性非比较类排序。

【稳定性】稳定

【时间复杂度】O(n+k)。

【空间复杂度】O(n)。

【要求】要求待排序记录的最大值不能太大,记录为自然数。

【示例代码】

1、借助中间数列c[i]保存数i的个数。辅助数列c大小开到k即可。代码相对简单,但失去稳定性——这不是计数排序的标准写法。

void count_sort(int n,int k){//要求n个记录为在[0..k]的整数 
	for(int i=0;i<n;i++) c[a[i]]++;//计算a[i]共有多少个
	int cns=0; 
	for(int i=1;i<=k;i++)
		for(;c[i];c[i]--)
			ranked[cns++]=i;
}

2、借助中间数列c[i]保存数i在排好序的记录中的位置序号。用到前缀和知识。辅助数列c大小开到k即可。保持稳定性——这是计数排序的标准写法。

void count_sort(int n,int k){//要求n个记录为在[0..k]的整数 
	for(int i=0;i<n;i++) c[a[i]]++;//计算a[i]共有多少个 
	for(int i=1;i<=k;i++) c[i]=c[i]+c[i-1];//前缀和。计算i在排好序的记录中的位置序号 
	for(int i=n-1;i>=0;i--)ranked[--c[a[i]]]=a[i];
	//a[i]在排好序的记录中的位置序号为c[a[i]],保存到数组ranked中,并将位置序号减1 
}

二、基数排序

【原理】将待排序数按个位数排序后,再按十位数排序,再按百位数排序,……,一直到按最高位排序为止。

三、桶排序

【原理】给出若干有序桶,将记录有序地装入。每个桶的大小可以不是1。常见的桶的大小为1,此时与计数排序没有区别。

【参考文献】

1、https://blog.csdn.net/K346K346/article/details/50791102

猜你喜欢

转载自blog.csdn.net/qq_36314344/article/details/81415169