首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js实现基数算法

基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。以下是关于基数排序的一些基础概念、优势、类型、应用场景以及如何用JavaScript实现它。

基础概念

基数排序通过按照数字的每一位进行排序,从最低有效位(个位)开始,逐步向高位进行,直到最高位排序完成。它通常使用稳定的排序算法(如计数排序)作为子过程。

优势

  1. 时间复杂度低:对于整数排序,基数排序的时间复杂度为O(nk),其中n是待排序元素的个数,k是数字位数。在k较小的情况下,基数排序的性能优于比较型排序算法。
  2. 稳定性:基数排序是稳定的排序算法,即相同值的元素在排序后保持原有的相对顺序。
  3. 适用性广:不仅适用于整数排序,还可以扩展到字符串、日期等有序数据的排序。

类型

基数排序主要分为两种类型:

  1. LSD(Least Significant Digit)基数排序:从最低有效位开始排序,逐步向高位进行。
  2. MSD(Most Significant Digit)基数排序:从最高有效位开始排序,逐步向低位进行。LSD基数排序更常用。

应用场景

基数排序适用于大量数据的整数排序,特别是当位数较少时。例如,电话号码、身份证号码等排序。

JavaScript实现

以下是一个使用LSD方法的基数排序的JavaScript实现示例:

代码语言:txt
复制
function radixSort(arr) {
    const max = Math.max(...arr);
    let exp = 1; // 指数,表示当前位数(个位、十位、百位等)

    while (Math.floor(max / exp) > 0) {
        arr = countingSortByDigit(arr, exp);
        exp *= 10;
    }

    return arr;
}

function countingSortByDigit(arr, exp) {
    const n = arr.length;
    const output = new Array(n).fill(0);
    const count = new Array(10).fill(0);

    // 统计每个桶中的元素个数
    for (let i = 0; i < n; i++) {
        const digit = Math.floor(arr[i] / exp) % 10;
        count[digit]++;
    }

    // 将count[i]更新为前i个桶中元素的总数
    for (let i = 1; i < 10; i++) {
        count[i] += count[i - 1];
    }

    // 构建输出数组(从后向前遍历以保证稳定性)
    for (let i = n - 1; i >= 0; i--) {
        const digit = Math.floor(arr[i] / exp) % 10;
        output[count[digit] - 1] = arr[i];
        count[digit]--;
    }

    return output;
}

// 示例用法
const arr = [170, 45, 75, 90, 802, 24, 2, 66];
console.log(radixSort(arr)); // 输出: [2, 24, 45, 66, 75, 90, 170, 802]

解释

  1. radixSort函数:主函数,负责确定最大数的位数,并依次对每一位进行排序。
  2. countingSortByDigit函数:辅助函数,使用计数排序对数组按照指定位数进行排序。
  3. 稳定性保证:在构建输出数组时,从后向前遍历原数组,确保相同位数的元素保持原有顺序。

注意事项

基数排序的空间复杂度较高,因为它需要额外的存储空间来保存计数数组和输出数组。此外,基数排序对于非整数数据(如浮点数、字符串等)需要进行适当的预处理或扩展算法才能应用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Python算法——基数排序

    基数排序(Radix Sort)是一种非比较性排序算法,适用于对整数或字符串等数据进行排序。...基数排序是一种稳定的排序算法,适用于整数或字符串排序。本文将详细介绍基数排序的工作原理和Python实现。...:2, 802 桶 4:24 桶 5:75 桶 6:66 桶 7: 桶 8: 桶 9:45 合并所有的桶,得到有序数组:[170, 90, 802, 2, 24, 75, 66, 45] Python实现基数排序...基数排序是一种非比较性排序算法,适用于整数或字符串排序。 总之,基数排序是一种高效的非比较性排序算法,通过分别处理每个位上的数字来排序,从最低位到最高位,或者反之,实现了对整数或字符串数组的排序。...了解基数排序有助于理解非比较性排序算法的思想,提供了一种适用于特定场景的排序解决方案。

    29410

    算法:基数排序

    什么是基数排序? 基数排序(Radix Sort)是一种非比较整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。 2....基数排序的代码实现 func radixSort(arr []int) []int { max := getMax(arr) for exp := 1; max/exp > 0; exp...基数排序的性能 时间复杂度:O(nk),其中n是输入元素的数量,k是数字的最大位数。 空间复杂度:O(n + k)。 5. 基数排序的优缺点 优点:对于数字位数不是非常大的序列,基数排序非常高效。...总结 基数排序是一种非常特殊的排序算法,它通过多次的按位排序和收集来实现整体的排序。这种方法在处理整数序列时特别有效,特别是当整数的范围相对集中时。...掌握基数排序的原理和代码实现,可以帮助我们理解如何通过非比较的方式对整数进行排序,这在某些特定场景下可能非常有用。

    22230

    算法渣-排序-基数排序

    没有一身好内功,招式再多都是空;算法绝对是防身必备,面试时更是不可或缺;跟着算法渣一起从零学算法 线性排序 常见的三种以线性时间运行的算法:计数排序、基数排序和桶排序; 需要注意的是线性排序算法是非基于比较的排序算法...基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。...由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数 算法 原理是将整数按位数切割成不同的数字,然后按每个位数分别比较 基数排序可以采用两种方式: LSD(Least...//现在主数组A[] 包含了根据现在位数位置排好序的数字 for i=0 to n do A[i] = result[i] end for(j) end func 实现...则基数排序的时间复杂度为O(d(n+r))。 空间复杂度 在基数排序过程中,对于任何位数上的基数进行“装桶”操作时,都需要n+r个临时空间

    46530

    基数排序python实现

    基数排序python实现 基数排序 基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。...由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。 所以基数排序的原理就是,先排元素的最后一位,再排倒数第二位,直到所有位数都排完。...从这个图中也能看出,排序是基于桶排序实现的。 然后就像排最低位一样,然后再排倒数第二位,再排倒数第三位。注意向桶中放元素的时候一定要按顺序放。...具体代码 这里将列表进行基数排序,默认列表中的元素都是正整数 def radix_sort(s): """基数排序""" i = 0 # 记录当前正在排拿一位,最低位为1 max_num...345345], [], [], [], [], [], []] [1, 4, 5, 7, 23, 45, 67, 78, 99, 334, 345, 3453, 23424, 345345] 总结 基数排序不仅仅只能排正整数

    91030

    排序算法(十):基数排序

    基数排序也可以称为多关键字排序,同计数排序类似,也是一种非比较性质的排序算法。将待排序集合中的每个元素拆分为多个总容量空间较小的对象,对每个对象执行桶排序后,则完成排序过程。...而桶排序又是一种对元素总容量敏感的排序算法,所以存在使用限制。 基数排序过程中也使用了桶排序操作,不过对于桶排序面向的对象进行了优化。...若元素最大位数为 ,则算法的复杂为 。 算法分析 由算法过程可知,基数排序的时间复杂度为 ,其中 为元素最大位数,也就是迭代比较的次数。...算法过程中需要申请的空间大小为 ,其中 表示待排序元素的基数,例如示例中的十进制整数排序,则 ;若待排序元素为字符串,则 ,因为基数的容量空间总是有限的,所以算法的时间复杂度为 。...其实基数排序中不一定按照每一位进行排序,也可能元素中的几位构成了一个组合,按照组合为单位进行排序。同时排序算法也不一定是桶排序方式,可以是别的排序算法,也可以给不同位使用不同的排序算法。

    1.2K10

    C#基数排序算法

    前言 基数排序是一种非比较性排序算法,它通过将待排序的数据拆分成多个数字位进行排序。 实现原理 首先找出待排序数组中的最大值,并确定排序的位数。...代码实现         public static void RadixSort(int[] array)         {             if (array == null || array.Length...RadixSort(array);             Console.WriteLine("排序后数组:" + string.Join(", ", array));         } 运行结果 总结 基数排序是一种稳定的排序算法...,它的时间复杂度为O(d*(n+r)),其中d是位数,n是元素个数,r是基数(桶的个数)。...相比其他比较性排序算法,基数排序的优势在于减少了元素之间的比较次数,并且可以处理负数。但是,基数排序的缺点是需要额外的空间来存储临时数组。

    17610

    C#基数排序算法

    基数排序(Radix Sort)是一种非比较型整数排序算法,其基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。这个算法在处理大量数据时非常有效,尤其是当数据的范围很大时。...算法的核心在于从最低位开始,逐位比较并排序,直到最高位。这个过程可以通过使用稳定的排序算法(如计数排序或桶排序)来实现。基数排序的算法步骤找到最大数:首先找出数组中的最大数,确定排序时需要处理的数位。...基数排序的C#实现下面是一个基数排序算法的C#实现示例:using System;using System.Collections.Generic;class Program{ static void...为了优化基数排序,可以采取以下措施:使用多级基数排序:对于大数据集,可以先使用基数排序对数据进行粗略排序,然后再使用其他排序算法进行精细排序。...下面是一个优化后的基数排序算法的C#实现示例,使用多级基数排序:using System;using System.Collections.Generic;using System.Linq;class

    2.3K00
    领券