对基数排序进行代码解释一下
时间: 2024-10-07 07:06:35 浏览: 33
基数排序是一种非比较型整数排序算法,它的基本思想是将待排序的整数按照位数切割成不同的数字,然后按每个位数分别比较。以下是基数排序的一个简单C语言实现:
首先,我们需要几个辅助函数:
- `counting_sort` 函数用于对每一位进行计数排序,它接收一个数组、当前位(如十进制的个位)作为参数。
- `radixsort` 函数是主函数,它负责整个排序过程。
```c
#include <stdio.h>
#include <stdlib.h>
// 计数排序函数
void counting_sort(int arr[], int exp) {
int output[100], count[10], i;
// 初始化计数数组
for (i = 0; i <= 9; i++)
count[i] = 0;
// 统计每个数字在当前位出现的次数
for (i = 0; i < 10; i++)
count[(arr[i] / exp) % 10]++;
// 将计数转换为实际位置
for (i = 1; i <= 9; i++)
count[i] += count[i - 1];
// 将原始数组元素复制到输出数组,并更新其在原数组中的位置
for (i = 9; i >= 0; i--) {
for (int j = count[i] - 1; j >= 0; j--) {
output[count[i] - 1 - j] = i * exp + arr[j];
}
}
// 将排序后的数据回填到原数组
for (i = 0; i < 100; i++)
arr[i] = output[i];
}
// 主函数:基数排序
void radixsort(int arr[], int n) {
int m = INT_MAX, digit_position = 1; // 找出最大值,确定最少需要几位
while (m != 0) {
m /= 10; // 移动到下一位
counting_sort(arr, m); // 对当前位进行计数排序
digit_position++; // 更新位数
}
}
// 示例:读取用户输入并进行基数排序
int main() {
int arr[100], n, i;
printf("Enter the number of elements: ");
scanf("%d", &n);
printf("Enter the elements: ");
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
radixsort(arr, n);
printf("Sorted array: ");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
在这个例子中,基数排序首先通过不断移动到更高的位(从最低有效位开始),对每一个位进行计数排序。这个过程会持续到最高位,也就是所有数字的最大位数。计数排序使得我们可以直接基于每位的数值大小进行排序,不需要复杂的比较操作,因此基数排序对于整数特别高效。
阅读全文