📜  排序算法-基数排序(1)

📅  最后修改于: 2023-12-03 15:39:50.007000             🧑  作者: Mango

排序算法之基数排序

基数排序是一种非比较型排序算法,按照数字的位数进行排序。它属于稳定排序,时间复杂度为O(d * (n+k)),其中d为数字的位数,k为基数,n为数字的个数。

基本思路

基数排序的基本流程是:将排序数按照个位数大小进行排序,同样的操作再按十位数大小排序,以此类推直到最高位数大小排序为止。这里需要用到桶排序的思想,具体步骤如下:

  1. 找出待排序数中最大的数,确定排序的轮数;
  2. 确定每一轮排序的位数,从低位到高位;
  3. 根据当前位数进行入桶操作,记录每个桶中数字的个数;
  4. 根据桶中数字的个数,对其进行累加,得到每一个桶的结束下标;
  5. 反向遍历原数组,根据当前位数对每个数进行出桶操作并覆盖到原数组中;
  6. 重复步骤3-5,直到所有位数排序完成。
代码实现

下面是使用Python语言实现基数排序的代码:

def radix_sort(arr):
    # 找出最大数,确定排序轮数
    max_num = max(arr)
    digit = len(str(max_num))
    bucket = [[] for _ in range(10)]
    for i in range(1, digit+1):
        # 将每个数入桶
        for j in arr:
            bucket[j // 10 ** (i-1) % 10].append(j)
        # 确定结束下标
        count = [len(k) for k in bucket]
        for m in range(1, 10):
            count[m] += count[m-1]
        # 反向遍历桶取数
        temp = [0] * len(arr)
        for n in range(len(arr) - 1, -1, -1):
            index = arr[n] // 10 ** (i-1) % 10
            temp[count[index] - 1] = arr[n]
            count[index] -= 1
        arr = temp
    return arr
总结

基数排序有两个明显的不足之处:首先,需要使用桶排序的思想,需要开辟桶来存储数据,空间利用率较低;其次,数据的长度必须可以取到整数的表示,否则需要在位数较少的情况下进行填充。因此,在处理大数据时,基数排序不一定是最优的选择。