首页 > 其他分享 >基数排序

基数排序

时间:2025-01-12 11:56:05浏览次数:1  
标签:10 arr num 复杂度 基数排序 排序

基数排序(Radix Sort)是一种非比较型整数排序算法,它根据数字的每一位来进行排序。基数排序通过多轮对不同位(如个位、十位、百位等)的排序,逐步使整个序列有序。

1. 基本原理

  • 基数排序是基于桶排序的思想,将整数按位数切割成不同的数字,然后按每个位数分别进行排序。
  • 排序时从最低位(个位)开始,依次对每一位进行排序,直到最高位排序完成。每一轮排序都是稳定的,前一轮的排序结果作为下一轮排序的基础,最终使整个序列有序。

2. 算法步骤

  1. 确定基数:基数通常为10,因为我们使用的是十进制数系统(每一位数字的取值范围是0 - 9)。
  2. 找出最大数:确定数组中的最大数,以便知道排序需要进行的轮数。最大数的位数决定了需要排序的轮数。
  3. 按位排序
    • 从最低位(个位)开始,对数组中的每个元素按照当前位的数字放入对应的桶(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)\)。
  • 稳定性:基数排序是稳定的排序算法。在每一轮按位排序中,当两个元素在当前位上的数字相同时,它们在原数组中的相对顺序不会改变。例如,对于数组 [12, 22],在个位排序时,它们会进入同一个桶,并且按照原顺序取出,保证了稳定性。

标签:10,arr,num,复杂度,基数排序,排序
From: https://www.cnblogs.com/codersgl-blog/p/18666810

相关文章

  • 全面解析基数排序:定义、原理、复杂度、稳定性及实现步骤详解
    定义基数排序(RadixSort)是一种非比较型整数排序算法,它是根据数字的每一位来排序。它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。对于有d位的整数,需要进行d趟排序。工作原理以最低有效位(Least-Significant-Digit,LSD)为例首先,考虑待排序的整数......
  • 7-288 简单的基数排序
    桶式排序是一种简单的基数排序。桶式排序(这里以对若干个正整数的排序为例描述求解过程):待排序的正整数存放在一维数组中,此外还有一个整型的二维数组,其中行下标从0~9,列下标从0~n–1。在这里,n是待排序的数组中元素的数目。二维数组的每行称为一个桶。编写一个程序,读入15个正整数,并......
  • 写一个方法实现“基数排序算法”,并解释下时间复杂度和空间复杂度
    functionradixSort(arr){if(!Array.isArray(arr)||arr.length<=1){returnarr;}//1.找到数组中的最大值,以确定最大位数letmax=Math.max(...arr);letexp=1;//1,10,100...//2.循环执行计数排序,从个位到最高位while(max/exp>=......
  • python 入门九大排序:1冒泡排序2插入排序3选择排序4快速排序5归并排序6堆排序7计数排序
    1冒泡排序:冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。代码如下:importnumpyasnpdefbubbling(arr):n=len(arr)foriinrange(n-1):forjinrange(n-i-1):ifarr[j......
  • Java算法之基数排序(Radix Sort)
    简介基数排序是一种非比较型整数排序算法,其原理是按照低位先排序,然后收集,再按照高位排序,再收集,依次类推,直到最高位。这种方法可以视为对每个位上的数字进行稳定的排序。算法步骤确定最大数的位数。对每一位进行排序:从最低位开始,使用稳定的排序算法(如计数排序)对当前位进......
  • 排序算法 基数排序 RadixSort --C语言实现
    基数排序基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucketsort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数......
  • 基数排序算法Python实现
    1.基数排序原理和步骤基数排序是一种非比较型的排序算法,特别适用于处理整数或者字符串等可以分解为多个部分的数据。其基本思想是按位(或字符)进行排序,从最低有效位到最高有效位逐次排序。基数排序常分为LSD(LeastSignificantDigit)和MSD(MostSignificantDigit)两种类型。以......
  • 基数排序 LSD py
    链接:https://www.nowcoder.com/questionTerminal/1e68ccb2cbc74c3d9e0dea0c568789b8设数组S[]={154,265,146,31,213,14,157,189,91,10,111,123},采用最低位优先(LSD)基数排序将S排列成升序序列,第1趟分配收集后元素14之前,之后紧邻的元素是()第1趟分配收集后的结果为:10,31,91,111,213,......
  • 【算法】冒泡排序、简单选择排序、基数排序、插入排序、希尔排序
    冒泡排序冒泡排序的核心思想是两两进行对比交换。从索引i=0开始,索引i所对应的值与索引i+1所对应的值进行对比交换。不断进行以上操作,每一轮都会让至少一个数变得符合顺序。packagecom.test;importjava.util.Arrays;publicclassBubbleSort{ publicstaticvoi......
  • 基数排序详解
    基数排序详解一、基数排序的基本概念二、基数排序的特点二、基数排序的工作过程三、基数排序的伪代码四、基数排序的C语言代码示例五、基数排序的稳定性六、基数排序的优化与变体七、基数排序的应用场景八、结论在计算机科学中,排序算法是一种非常基础和重要的算法类型......