同步首发 http://www.dujuns.com/article/2022/2/23/15.html
基本思想
基数排序是桶排序的升级版本,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
桶排序
桶排序很简单,首先按照待排序数组中最大的数申请多少个桶。比如排序5 1 2 5 3
,最大的数字是5,需要申请5个桶,然后从第一个元素开始,依次将元素丢入相应的桶中,最后只需要循环检查一点桶中的元素依次输出就实现排序了,下图表示桶排序过程。就相当于哈希表。
#include<stdio.h>
void bucketSort(int arr[], int length);
void main()
{
int arr[] = {
5, 1, 2, 5, 3};
bucketSort(arr, 5);
int k;
for(k=0; k<5; k++){
printf("%d ", arr[k]);
}
}
void bucketSort(int arr[], int length)
{
//申请6个桶
int bucket[5];
int i;
for(i=0; i<6; i++){
bucket[i] = 0;//初始化桶中元素数量为0
}
//将元素放入桶中
int j;
for(j=0; j<length; j++){
bucket[arr[j]]++;
}
//处理结构
int k;//桶的编号
int g=0;//存放排序后数组编号
for(k=0; k<6; k++){
while(bucket[k] > 0){
arr[g] = k;
g++;
bucket[k] --;
}
}
}
基数排序算法
桶排序是能在线性时间内完成的,比插入排序,快速排序都要快。桶排序适合一定规模的数组排序(比如分数,年龄等)。但是一般不合适这种情况,比如要排序2 1 5 999999
。这个时候如果按照桶排序的思路,需要申请999999个桶,显然,空间浪费太大。所以接下来介绍基数排序来解决这个问题.
图解算法
如上图的9个数字,先按照个位数放入桶中
生成一个新的链表,从0桶
开始&#