分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O(n)。
下面介绍三种线性排序的算法:
1:计数排序
2:基数排序
3:桶排序
一:计数排序
1:原理
计数排序假设:N个输入元素中的每一个都是介于0~k之间的整数,此处k为某个整数。当k=O(n)时,计数排序的运行时间O(n)。
算法思想:对每一个输入元素x,确定出小于x的元素个数;有了这一个信息,就可以直接把x放在最终输出数组的位置上。如果有m个小于x,那x就放在m+1的位置上。
计数排序要求被排序元素都是整数型变量,即元素能用数组的指标表示
(1)统计个元素 i 的个数
(2)计算不超过 i 包括 i 的元素的个数
(3)将元素 i 放入适当的位子。
2:实现
void CountSort(int arr[],int n,int k)
{
int i;
int *B = (int *)malloc(n*sizeof(int));
if(!B){
printf("malloc error!");
exit(1);
}
int *C = (int *)malloc((k+1)*sizeof(int)); //因为要存储0--k个数据
if(!C){
printf("malloc error!");
exit(1);
}
for(i=0;i<=k;i++) //将数组元素初始化为0
C[i] = 0;
for(i=0;i<n;i++){ //对C数组的每个元素开始计数
C[arr[i]]++;
}
for(i=1;i<=k;i++) //找到正确的i位置
C[i]= C[i]+C[i-1];
for(i=n-1;i>=0;i--){ //利用临时数组B存储有序数组
B[C[arr[i]]-1] = arr[i]; //这里必须让C[arr[i]]-1!因为数组是从0开始计数的,而C统计的是个数
C[arr[i]] -= 1;
}
for(i=0;