☘前言☘
今天是算法零基础打卡的第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. 最大间距
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 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;
}
📑写在最后
今天这个基数排序的代码简直绝了,得回味回味,最近在更新一些硬核文章,如果大佬们喜欢的话,还希望给个点赞评论啥的。谢谢啦!