算法——基数排序

简介: 算法——基数排序

一、算法简介

基数排序(Radix Sort)是一种非比较型的排序算法,适用于待排序元素为非负整数的情况。它根据元素的位数(基数)进行排序,在每一位上对元素进行稳定的排序,最终得到有序序列。

基数排序的基本思想是,按照个位、十位、百位等依次对待排序元素进行排序。首先将待排序元素按照个位数的大小分配到09的桶中,然后按照桶的顺序依次取出元素得到一个新的序列;接着根据十位数的大小再次分配到09的桶中,再次按照桶的顺序取出元素进行排序。直到最高位排序完成,整个序列就变成了一个有序序列。

基数排序的时间复杂度为 O(d*(n+k)),其中 d 是最大元素的位数,n 是待排序元素的数量,k 是基数的大小(例如十进制中的k=10)。由于基数排序是非比较型的排序算法,它不受元素的大小关系影响,因此可以在某些情况下具有较好的性能。

二、算法实现

下面是基数排序的C#实现示例:

public static void RadixSort(int[] array)
{
    int n = array.Length;
    if (n <= 1)
    {
        return;
    }
    // 找到最大值
    int maxVal = array[0];
    for (int i = 1; i < n; i++)
    {
        if (array[i] > maxVal)
        {
            maxVal = array[i];
        }
    }
    // 按照个位、十位、百位...进行排序
    for (int exp = 1; maxVal / exp > 0; exp *= 10)
    {
        CountingSortByDigit(array, n, exp);
    }
}
private static void CountingSortByDigit(int[] array, int n, int exp)
{
    int[] output = new int[n];
    int[] count = new int[10]; // 0~9
    // 统计待排序元素出现的次数
    for (int i = 0; i < n; i++)
    {
        count[(array[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[(array[i] / exp) % 10] - 1] = array[i];
        count[(array[i] / exp) % 10]--;
    }
    // 将排序好的结果复制回原始数组
    for (int i = 0; i < n; i++)
    {
        array[i] = output[i];
    }
}

调用示例:

int[] array = { 170, 45, 75, 90, 802, 24, 2, 66 };
RadixSort(array);
Console.WriteLine("排序后的数组:");
foreach (int element in array)
{
    Console.Write(element + " ");
}

以上是基数排序的一个示例实现。在这个示例中,我们首先找到待排序数组中的最大值,以确定需要排序的位数。然后按照每一位的大小进行稳定的计数排序,通过不断更新count数组来计算每个元素在有序排列中的最后一个位置的索引。接着,根据位数信息将元素放入输出数组,最后将排序好的结果复制回原始数组。

需要注意的是,在应用基数排序时,需要根据待排序元素的特性确定排序位数,并确保待排序元素都是非负整数或可映射到非负整数范围内。如果待排序元素不满足这个要求,就需要进行适当的映射转换,才能使用基数排序算法。

相关文章
|
算法 搜索推荐 Python
Python算法——基数排序
Python算法——基数排序
93 1
|
2月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
34 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
2月前
|
搜索推荐 Java Go
深入了解基数排序算法
深入了解基数排序算法
34 3
|
7月前
|
算法 前端开发
前端算法之基数排序
前端算法之基数排序
45 1
|
6月前
|
算法 C语言
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
38 0
|
7月前
|
搜索推荐 算法 Java
【数据结构排序算法篇】----基数排序【实战演练】
【数据结构排序算法篇】----基数排序【实战演练】
57 3
|
存储 算法 搜索推荐
数据结构各内部排序算法总结对比及动图演示(插入排序、冒泡和快速排序、选择排序、堆排序、归并排序和基数排序等)2
数据结构各内部排序算法总结对比及动图演示(插入排序、冒泡和快速排序、选择排序、堆排序、归并排序和基数排序等)2
279 0
|
存储 搜索推荐 算法
八大排序算法-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(下)
八大排序算法-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(下)
|
搜索推荐 算法 Java
【算法】基数排序的原理与Java实现
基数排序(Radix Sort)是一种非比较性的排序算法,它根据元素的位数逐位进行排序。基数排序的核心思想是将待排序的元素按照低位到高位的顺序进行排序,每一位都使用稳定的排序算法(通常是计数排序或桶排序)。通过多次按位排序,最终可以得到有序的结果
117 0
|
7月前
|
算法 搜索推荐 Java
数据结构与算法面试:基于比较的排序算法时间复杂度最坏情况下是 O(nlogn),请问有没有更快的算法?(提示:计数排序、基数排序)
数据结构与算法面试:基于比较的排序算法时间复杂度最坏情况下是 O(nlogn),请问有没有更快的算法?(提示:计数排序、基数排序)
53 0