[解题报告]《算法零基础100讲》(第39讲) 非比较排序 - 计数排序

请添加图片描述


☘前言☘

今天是算法零基础打卡的第40天,题目本身不难,主要是为了理解基数排序的。上链接:
《算法零基础100讲》(第40讲) 非比较排序 - 基数排序
全文大约阅读时间: 20min

🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)


🎁主要知识点

基数排序

基数排序很有意思,基本上就是先排序低位再排序高位。按照每位的大小进行hash映射然后进行收集。如果有四位,完成四次分配与收集能能完成。适合数据范围不大但是数据量很大的情况。其中因为要保证收集的时候保证FIFO,需要用队列的知识,现在大家应该很熟悉了。用数组去模拟就好了。

这里的代码很巧妙的先计算分配后每个数字里面有多少个元素,这样就可以把每个a[i]映射到新的下标,就可以直接写入了。非常巧妙。

void radixsort(int *a, int n) {
  int i, b[MAX], m = a[0], exp = 1; //m为最大值
  for (i = 1; i < n; i++) 	//求最大值
    if (a[i] > m) 
      m = a[i];

  while (m / exp > 0) {	//当最大值有这一位的时候进行分配收集
    int bucket[BASE] = { 0 };	//初始化所有的分配为0

    for (i = 0; i < n; i++) 	//确定每个分配数字的数量
      bucket[(a[i] / exp) % BASE]++;

    for (i = 1; i < BASE; i++) //确定每个数字的偏移量
      bucket[i] += bucket[i - 1];

    for (i = n - 1; i >= 0; i--)//将对应的元素写入对应位置
      b[--bucket[(a[i] / exp) % BASE]] = a[i];

    for (i = 0; i < n; i++) //将b数组写回
      a[i] = b[i];

    exp *= BASE;//提高一位
  }
}

📓课后习题

164. 最大间距

164. 最大间距

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。

解题思路

直接排序返回就好了呗?

int cmp(int *a, int *b){return *b < *a;}
int maximumGap(int* nums, int numsSize){
    qsort(nums ,numsSize ,sizeof(int) ,cmp);//排序
    int max = 0;	//默认为0
    for(int i = 1;i < numsSize;i++)//从1开始遍历
        if(max < nums[i] - nums[i - 1]) max = nums[i] - nums[i - 1];

    return max;
}

📑写在最后

今天这个基数排序的代码简直绝了,得回味回味,最近在更新一些硬核文章,如果大佬们喜欢的话,还希望给个点赞评论啥的。谢谢啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XingleiGao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值