排序算法之分配排序(线性时间排序)

分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶: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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值