基数排序
例子
假设我们有如下一堆数字:
- 我们先以个位的大小对其进行排序,得到的结果就是:
-
再以十位的大小对其进行排序,得到的结果是:
-
最后以百位的大小进行排序,得到的结果是:
-
这样我们就得到了最后有序的数组
原理
- 基数排序可以分为高位基数排序和低位基数排序两种,我们这里举例为低位的基数排序
- 实现这一操作必须保证的是:我们这个操作必须是稳定的,也就是说原来在前面的元素,如果两个值相等的话,原来在前的元素排序后依然在前面
- 这样我们对个位排序过后,排序后的数字个位及以下的数字就是有序的了
- 同理,对十位进行排序过后,排序后的数字十位及以下的数组就已经是有序的了。
- 那么我们一直到对最高的位数进行排序,最终就可以得到真正有序的顺序了。
- 当然,也可以做高位的基数排序。这样就有点类似于分治的思想
- 对最高位排序后,相当于把最高位相同的所有元素放入一个桶中,在再这个桶中递归的做这件事,在桶中将所有的元素都排列好
- 这样所有的桶都是有序的了之后,最后组合在一起,就一样是有序的。
实现:
低位基数排序C语言实现:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int* sort(int arr[],int n,int max) {
int* result = (int*)malloc(n * sizeof(int));
//这个就是桶
int count[10];
for (int i = 0; i < 10; i++) {
count[i] = 0;
}
for (int i = 0; i < max; i++) {
int division = (int)pow(10, i);
for (int j = 0; j < n; j++) {
int num = arr[j] / division % 10;
count[num]++;
}
for (int m = 1; m < 10; m++) {
count[m] = count[m] + count[m - 1];
}
//为了保证是稳定的排序,这里需要从最大的那一位开始
for (int i = n - 1; i >= 0; i--) {
int num = arr[i] / division % 10;
result[--count[num]] = arr[i];
}
//对结果进行一个复制
for (int i = 0; i < n; i++) {
arr[i] = result[i];
}
//对count数组进行初始化
for (int i = 0; i < 10; i++) {
count[i] = 0;
}
}
return result;
}
int main() {
int size = 8;
int arr[] = { 421,240,115,532,305,430,125,1234};
int max = 4;
int* result = sort(arr, size,max);
for (int i = 0; i < size; i++) {
printf("%d\n", result[i]);
}
}