JS实现的计数排序与基数排序算法示例

可能需要先说明一下,计数排序和基数排序都是针对整数排序的算法。

1. 计数排序

计数排序的基本思想是将每个元素出现的次数统计出来,并按顺序排列。计数排序不是基于元素比较的,而是建立在元素的值域范围较小的前提下的。因此,计数排序的时间复杂度是O(n+k),其中k是元素的值域大小。

算法步骤

  1. 统计每个数字出现的次数,得到一个长度为k的计数数组。
  2. 将计数数组进行变形,使得第i个元素是所有小于等于i的元素出现次数的总和(从1开始累积),这样计数数组中的值就是元素排名。
  3. 开一个长度为n的排序数组,遍历原数组,将每个元素插入到排序数组中对应的位置,再将计数数组中对应元素的值-1。

示例1

假设有一个需要排序的数组arr为[1, 3, 2, 3, 2, 4, 1, 5, 2],值域为[1, 5]。

  1. 初始化长度为5的计数数组count为[0, 0, 0, 0, 0]。
  2. 遍历arr数组,对于每遇到一个数,则在count数组相应位置上加1。
遍历到1时,count数组变为 [1, 0, 0, 0, 0]
遍历到3时,count数组变为 [1, 0, 0, 1, 0]
遍历到2时,count数组变为 [1, 0, 1, 1, 0]
遍历到3时,count数组变为 [1, 0, 1, 2, 0]
遍历到2时,count数组变为 [1, 0, 2, 2, 0]
遍历到4时,count数组变为 [1, 0, 2, 2, 1]
遍历到1时,count数组变为 [2, 0, 2, 2, 1]
遍历到5时,count数组变为 [2, 0, 2, 2, 2]
遍历到2时,count数组变为 [2, 0, 3, 2, 2]
  1. 对于计数数组count进行变形,累加每个位置前面的元素。在本例中,累加后的计数数组count变为[2, 2, 5, 7, 9]。
  2. 创建一个长度为9的新数组sorted,遍历原始数组arr,将数字按照排名依次放入新数组中。
第一次取数字1,由于该数的排名为2,所以将该数放到sorted数组的索引为1的位置。
第二次取数字3,由于该数的排名为5,所以将该数放到sorted数组的索引为5的位置。
第三次取数字2,由于该数的排名为3,所以将该数放到sorted数组的索引为3的位置。
第四次取数字3,由于该数的排名为5,所以将该数放到sorted数组的索引为6的位置。 
第五次取数字2,由于该数的排名为3,所以将该数放到sorted数组的索引为4的位置。
第六次取数字4,由于该数的排名为7,所以将该数放到sorted数组的索引为7的位置。
第七次取数字1,由于该数的排名为2,所以将该数放到sorted数组的索引为2的位置。
第八次取数字5,由于该数的排名为9,所以将该数放到sorted数组的索引为9的位置。
第九次取数字2,由于该数的排名为3,所以将该数放到sorted数组的索引为5的位置。

排序后的数组为[1, 1, 2, 2, 2, 3, 3, 4, 5]

示例2

function countingSort(arr) {
  let max = Math.max(...arr);
  let count = new Array(max + 1).fill(0);
  for (let num of arr) {
    count[num]++;
  }
  let sortedIndex = 0;
  for (let i = 0; i <= max; i++) {
    while (count[i] > 0) {
      arr[sortedIndex++] = i;
      count[i]--;
    }
  }
  return arr;
}

该示例代码演示了计数排序的基本实现,时间复杂度为O(n+k)。函数接收一个数组参数arr,返回排好序的数组。对于每个数字num,遍历数组并将计数数组对应位置+1。然后根据计数数组,将所有数字放入排序数组中。函数内使用了一个while循环来处理数字重复的情况。

2. 基数排序

基数排序的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别进行比较排序,最终实现全局排序。基数排序属于非比较排序算法,时间复杂度为O(dn),其中d是数字位数。通常情况下,基数排序用于对整数进行排序。

算法步骤

  1. 取得操作数的最大位数,假设是k位。
  2. 对数组从最低位开始(第1位)进行排序。
  3. 从最低位排到最高位。
  4. 排序使用的方法:用10个桶依次分别对个位、十位、百位...进行排序。

示例1

假设有一个需要排序的数组arr为[3, 30, 34, 5, 9]。

  1. 取得数组arr的位数的最大值max,max为2位。
  2. 从低位到高位,分别按每一位进行排序。
  3. 对于本例,首先按照个位排序,将每个数字放入桶中,按照桶的顺序将数字取出,并按照个位排序。排序后的数组为[30, 5, 9, 3, 34]。
  4. 接下来按照十位排序,将每个数字放入桶中,按照桶的顺序取出数字,再按照个位排序。排序后的数组为[3, 30, 34, 5, 9]。
  5. 排序完成,最终数组为[3, 30, 34, 5, 9]。

示例2

function radixSort(arr) {
  const max = Math.max(...arr);
  const maxDigit = String(max).length;
  let mod = 10;
  let dev = 1;
  for (let i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
    let bucketList = new Array(10).fill([]);
    for (let j = 0; j < arr.length; j++) {
      let num = parseInt(arr[j] % mod / dev);
      let bucket = bucketList[num];
      bucket.push(arr[j]);
      bucketList[num] = bucket;
    }
    let res = [];
    for (let j = 0; j < bucketList.length; j++) {
      res.push(...bucketList[j]);
    }
    arr = res;
  }
  return arr;
}

该示例代码演示了基数排序的基本实现,时间复杂度为O(dn)。函数接收一个数组参数arr,返回排好序的数组。函数内的dev和mod用来分别获取数字每一位数值,在每次排序的循环中创建一个长度为10的二维桶bucketList。对于每个数字num,首先计算其在当前位的值,然后将其放入对应的桶上。排序完成后,将bucketList中的数字依次放入一个新数组res中,返回res。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现的计数排序与基数排序算法示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 用C语言实现二分查找算法

    当实现查找某个元素时,一个常见的算法是二分查找(Binary Search),也称作折半查找。二分查找是一种在有序数组中查找某一特定元素的搜索算法,将目标值与数组的中间元素进行比较,如果中间元素大于目标值,则在左半部分继续查找;如果中间元素小于目标值,则在右半部分继续查找。重复以上步骤,直到找到目标值或者确定目标值不存在。 以下是在C语言中实现二分查找的完整…

    算法与数据结构 2023年5月19日
    00
  • C语言手把手教你实现贪吃蛇AI(中)

    来看看如何实现贪吃蛇AI。首先,我们需要明确几个概念: 贪吃蛇:一个二维平面上移动的形如蛇的游戏角色。 AI:人工智能,指让计算机模拟人的智能行为。 贪吃蛇AI的实现需要完成以下步骤: 初始化游戏环境 实现蛇的移动 实现蛇的AI行为 检测游戏结束条件 接下来我们将一步步讲解如何实现这个过程。 1. 初始化游戏环境 在C语言中,我们需要使用 ncurses 库…

    算法与数据结构 2023年5月19日
    00
  • python 如何在list中找Topk的数值和索引

    对于如何在Python的list中找Topk的数值和索引,可以采用以下方法: 方法一:使用sorted函数排序 可以使用Python内置的sorted函数对list进行排序,然后取前k个元素,同时得到它们的索引。具体代码如下: lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] k = 3 # 记录每个元素的索引和值 lst_wi…

    算法与数据结构 2023年5月19日
    00
  • TypeScript调整数组元素顺序算法

    下面是详细的攻略: TypeScript调整数组元素顺序算法 在 TypeScript 中实现调整数组元素顺序的算法需要使用到以下两种方法: 方法一:splice() array.splice(startIndex, toRemove, …itemsToAdd) splice() 方法可以实现对数组中指定起始索引 startIndex 开始的若干元素的删…

    算法与数据结构 2023年5月19日
    00
  • C语言基本排序算法之插入排序与直接选择排序实现方法

    C语言基本排序算法之插入排序与直接选择排序实现方法 本文将介绍C语言中两种常见的基本排序算法:插入排序和直接选择排序。我们将会详细阐述它们的实现方法,并提供示例代码来帮助理解和实践。 插入排序 插入排序是一种简单而常见的排序算法,它将待排序的数列分成已排序和未排序两部分,初始时已排序部分只包含一个元素,随着算法的运行,每次从未排序部分中取出第一个元素插入到已…

    算法与数据结构 2023年5月19日
    00
  • C++实现快速排序(Quicksort)算法

    C++实现快速排序(Quicksort)算法 快速排序(Quicksort)算法是一种常见的排序算法,具有快速、高效、稳定性好等特点,广泛应用于各种工程实践中。 快速排序的基本思想 快速排序的基本思想是:选取一个基准值(pivot),将待排序序列划分成左右两个子序列,左边的子序列中所有元素都不大于基准值,右边的子序列中所有元素都不小于基准值,然后对左右两个子…

    算法与数据结构 2023年5月19日
    00
  • input标签内容改变的触发事件介绍

    当用户在表单中输入内容时,网页需要对用户输入进行实时的响应,以方便用户进行修改和确认。而input标签就是常用于表单输入的标签之一,它提供了多种类型的输入框,如文本框、单选框、复选框、下拉框等。在这些输入框中,当其中的内容发生改变时,我们需要将其更新到网页中,这时就需要用到“input标签内容改变的触发事件”。 事件是指在特定的时刻发生的动作或行为,而事件处…

    算法与数据结构 2023年5月19日
    00
  • php自定义排序uasort函数示例【二维数组按指定键值排序】

    首先,让我们先了解一下 uasort 函数。uasort 函数是 php 中的一个内置函数,用于对数组进行自定义排序。这个函数和 sort 函数的区别在于,uasort 函数允许我们自定义一个排序函数,在排序时使用这个函数进行排序,而 sort 函数则只能使用默认的排序函数。 下面是一个使用 uasort 函数的示例,演示如何对 PHP 二维数组按照指定键值…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部