基数排序(Radix Sort)是一种非比较型整数排序算法,它根据数字的每一位来进行排序。基数排序通过多轮对不同位(如个位、十位、百位等)的排序,逐步使整个序列有序。
1. 基本原理
- 基数排序是基于桶排序的思想,将整数按位数切割成不同的数字,然后按每个位数分别进行排序。
- 排序时从最低位(个位)开始,依次对每一位进行排序,直到最高位排序完成。每一轮排序都是稳定的,前一轮的排序结果作为下一轮排序的基础,最终使整个序列有序。
2. 算法步骤
- 确定基数:基数通常为10,因为我们使用的是十进制数系统(每一位数字的取值范围是0 - 9)。
- 找出最大数:确定数组中的最大数,以便知道排序需要进行的轮数。最大数的位数决定了需要排序的轮数。
- 按位排序:
- 从最低位(个位)开始,对数组中的每个元素按照当前位的数字放入对应的桶(0 - 9)中。
- 收集桶中的元素,按照桶的顺序(从0到9)依次取出元素,形成一个新的序列。
- 对下一位(十位、百位等)重复上述步骤,直到处理完最大数的最高位。
3. 代码实现
以下是Python语言实现基数排序的代码:
def radix_sort(arr):
if not arr:
return arr
max_num = max(arr)
exp = 1
while max_num // exp > 0:
buckets = [[] for _ in range(10)]
for num in arr:
buckets[(num // exp) % 10].append(num)
arr = [num for bucket in buckets for num in bucket]
exp *= 10
return arr
4. 算法分析
- 时间复杂度:
- 假设数组中有
n
个元素,且最大数有k
位。每一轮排序都需要遍历数组中的所有n
个元素,将它们放入桶中并收集,这个过程的时间复杂度为 \(O(n)\)。 - 总共需要进行
k
轮排序,所以基数排序的时间复杂度为 \(O(k * n)\)。在整数的情况下,如果数字的位数相对固定,基数排序的时间复杂度接近线性时间 \(O(n)\)。
- 假设数组中有
- 空间复杂度:
- 空间复杂度主要取决于桶的数量和每个桶中元素的数量。在最坏情况下,所有元素都集中在一个桶中,需要额外的 \(O(n)\) 空间来存储桶中的元素。同时,还需要
O(10)
的空间来存储桶的数组(因为基数为10)。 - 所以,基数排序的空间复杂度为 \(O(n + 10)\),通常可以简化为 \(O(n)\)。
- 空间复杂度主要取决于桶的数量和每个桶中元素的数量。在最坏情况下,所有元素都集中在一个桶中,需要额外的 \(O(n)\) 空间来存储桶中的元素。同时,还需要
- 稳定性:基数排序是稳定的排序算法。在每一轮按位排序中,当两个元素在当前位上的数字相同时,它们在原数组中的相对顺序不会改变。例如,对于数组
[12, 22]
,在个位排序时,它们会进入同一个桶,并且按照原顺序取出,保证了稳定性。