Radix sort
时间: 2023-12-03 08:40:04 浏览: 108
Radix sort(基数排序)是一种非比较性的排序算法,它将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序的时间复杂度为O(d(n+r)),其中d是数字位数,n是数字个数,r是基数。基数排序的优点是稳定性好,适用于整数排序,且时间复杂度较低。
以下是基数排序的基本思想和步骤:
1. 将待排序的整数按照个位数的大小放入0~9号桶中。
2. 将桶中的整数按照从0~9号桶的顺序依次取出,组成一个新的序列。
3. 将新的序列按照十位数的大小放入0~9号桶中。
4. 将桶中的整数按照从0~9号桶的顺序依次取出,组成一个新的序列。
5. 重复上述步骤,直到最高位排序完成。
以下是基数排序的Python代码实现:
```python
def radix_sort(nums):
max_num = max(nums)
max_digit = len(str(max_num))
for i in range(max_digit):
buckets = [[] for _ in range(10)]
for num in nums:
digit = (num // (10 ** i)) % 10
buckets[digit].append(num)
nums.clear()
for bucket in buckets:
nums.extend(bucket)
return nums
```
相关问题
解释一下radix sort C
Radix sort是一种非比较排序算法,它根据元素的位数进行排序。它将元素按照个位、十位、百位等依次进行排序,直到最高位。Radix sort的基本思想是将待排序的元素按照位数划分为若干个桶,然后依次对每个桶进行排序。每次排序时,根据当前位数的值将元素放入对应的桶中,然后按照桶的顺序依次取出元素,再按照下一位数进行排序,直到最高位。
以下是一个使用C语言实现的Radix sort的例子:
```c
#include <stdio.h>
// 获取数组中的最大值
int getMax(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
// 使用计数排序对数组按照指定的位数进行排序
void countSort(int arr[], int n, int exp) {
int output[n];
int count[10] = {0};
// 统计每个数字出现的次数
for (int i = 0; i < n; i++) {
count[(arr[i] / exp) % 10]++;
}
// 计算每个数字在输出数组中的位置
for (int i = 1; i < 10; i++) {
count[i] += count[i - 1];
}
// 将元素按照指定位数放入输出数组中
for (int i = n - 1; i >= 0; i--) {
output[count[(arr[i] / exp) % 10] - 1] = arr[i];
count[(arr[i] / exp) % 10]--;
}
// 将排序后的数组复制回原数组
for (int i = 0; i < n; i++) {
arr[i] = output[i];
}
}
// 使用Radix sort对数组进行排序
void radixSort(int arr[], int n) {
int max = getMax(arr, n);
// 对每个位数进行计数排序
for (int exp = 1; max / exp > 0; exp *= 10) {
countSort(arr, n, exp);
}
}
// 打印数组
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {170, 45, 75, 90, 802, 24, 2, 66};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原始数组:");
printArray(arr, n);
radixSort(arr, n);
printf("排序后的数组:");
printArray(arr, n);
return 0;
}
```
阅读全文