C语言如何用基数排序体现出不比较并且按基数和位数依次分配和收集的思想,用代码显示出来
时间: 2023-05-29 13:07:12 浏览: 89
基数排序的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。具体实现中,可以使用桶来实现按位数分配和收集。
以下是用C语言实现基数排序并体现其核心思想的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 获取数字num的第d位数字
int getDigit(int num, int d) {
int i;
for (i = 1; i < d; i++) {
num /= 10;
}
return num % 10;
}
// 基数排序函数
void radixSort(int *arr, int len) {
int i, j, digit, max = arr[0], exp = 1;
int *tmp = (int*)malloc(sizeof(int) * len);
for (i = 1; i < len; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
while (max / exp > 0) { // 从个位开始,依次对每一位进行排序
int bucket[10] = {0};
for (i = 0; i < len; i++) {
digit = getDigit(arr[i], exp);
bucket[digit]++;
}
for (i = 1; i < 10; i++) {
bucket[i] += bucket[i-1];
}
for (i = len-1; i >= 0; i--) { // 从后往前遍历,保证排序的稳定性
digit = getDigit(arr[i], exp);
tmp[--bucket[digit]] = arr[i];
}
for (i = 0; i < len; i++) {
arr[i] = tmp[i];
}
exp *= 10;
}
free(tmp);
}
// 测试代码
int main() {
int arr[] = {53, 89, 150, 36, 633, 233, 99, 0};
int len = sizeof(arr) / sizeof(arr[0]);
radixSort(arr, len);
int i;
for (i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
在上述代码中,`radixSort`函数中的循环依次对每个数字的每个位数进行排序。首先计算出数组中最大数的位数,然后从个位开始,依次对每个位数进行排序。在每次排序中,使用桶来统计每个数字的出现次数,并计算出每个数字的位置。然后从后往前遍历原数组,根据当前位数上的数字将数字放入相应的位置,最后将排序后的结果复制回原数组。这样依次对每个位数进行排序,最终得到的就是完整的有序数组。
在基数排序中,并没有像快速排序和归并排序那样进行元素之间的比较,而是根据每个数字的每个位数来进行排序。这样可以保证排序的稳定性,同时也可以充分利用数字的特点,将数字按位数分配到不同的桶中,从而提高了排序的效率。
阅读全文