基数排序是一种非比较的排序算法,它根据元素的位数进行排序。它将整数按照位数(个位、十位、百位等)进行分组,然后分别对每个位数进行稳定的排序。通过多次按位排序,最终可以得到有序的结果。
基数排序的思想是从低位到高位进行排序。具体步骤如下:
- 根据待排序的元素确定最大位数,假设为d位数。
- 从最低位开始,对所有元素按照该位的值进行排序。可以使用稳定的排序算法,如计数排序或桶排序。
- 排序完成后,将排序结果覆盖原数组。
- 重复步骤2和步骤3,依次对更高位进行排序,直到最高位(d位)排序完成。
- 最终得到的数组就是有序的结果。
基数排序的关键在于对位数的排序,而不是对整个元素进行比较。它的时间复杂度是O(d*(n+b)),其中n是数组的长度,d是最大位数,b是基数(每个位数的取值范围)。基数排序通常适用于待排序元素的位数相对较小的情况。
下面是基数排序的示例代码:
def countingSort(arr, exp):
n = len(arr)
output = [0] * n
count = [0] * 10
for i in range(n):
index = arr[i] // exp
count[index % 10] += 1
for i in range(1, 10):
count[i] += count[i - 1]
i = n - 1
while i >= 0:
index = arr[i] // exp
output[count[index % 10] - 1] = arr[i]
count[index % 10] -= 1
i -= 1
for i in range(n):
arr[i] = output[i]
def radixSort(arr):
max_value = max(arr)
exp = 1
while max_value // exp > 0:
countingSort(arr, exp)
exp *= 10
# 测试代码
arr = [170, 45, 75, 90, 802, 24, 2, 66]
radixSort(arr)
print("排序后的数组:")
print(arr)
在上述示例中,我们使用计数排序作为基数排序的辅助排序算法。首先,我们确定最大值,然后从个位开始,依次对每个位数进行计数排序。重复这个过程直到最高位排序完成。最后,我们得到了有序的数组。
需要注意的是,基数排序适用于整数排序,而对于字符串或其他类型的数据,我们需要将其转化为整数再进行排序。