软件教程 2025年08月6日
0 收藏 0 点赞 748 浏览 2194 个字
摘要 :

文章目录 前言 复杂度分析 代码实现 测试代码: 总结 本文重点讲解js前端算法实现桶排序的代码,如果你想看后端的实现,可以参考《Java实现桶排序(Bucket Sort)》……




  • 前言
  • 复杂度分析
  • 代码实现
    • 测试代码:
  • 总结

本文重点讲解js前端算法实现桶排序的代码,如果你想看后端的实现,可以参考《Java实现桶排序(Bucket Sort)》。

前言

桶排序是将原来的 n 条数据分成 m 份。每一份看成是一个桶。桶之间是有序的,只要桶内排好序,就可以按照桶的顺序依次取出每个数据。这样取出来的数据就是有序的了

举个例子,现在有一万份订单,订单的金额在 1 元到 1 万元之间。现在需要对订单的金额排序,由低到高,请问如何才能在 logn 的复杂下实现呢

利用桶排序的话,可以将一万份订单,分成 100 份,第一份的金额区间是 0-100 元,第二份的金额区间是 100-200 元,依次类推,第一百份的金额在 9900-10000 之间

然后将桶内的数据通过快速排序的方法排好序。读取数据的时候,就可以从前往后读,这样的数据,就是天然有序的了。这样分需要额外的空间存储的支持,但是分的越细,桶排序的速度越快。

想象一下,我们吧一万份订单直接分成一万份,也就是一万个桶,每个桶内部所存储的金额是相同,然后每个桶之间所存储的金额差是一元。这样所有订单的金额都有了对应的桶了。现在只要把所有订单全部遍历一遍,将订单放到对应金额的桶里面。不就完成了订单的排序吗?

对的,只要遍历一遍订单,就能排好序,那桶排序的复杂度不就是 O( n ) 么?

下面做一个定量分析

复杂度分析

k = n/mn 条数据,一共分成 m 份,每份有 k 条数据。
每个桶的内部使用快速排序的算法,时间复杂度就是k * logk。而且有 m 个桶,整体复杂度就是 m * k * logk,即 nlog(n/m)

当桶分的越多,log(n/m)就越小,整体的复杂度也就越接近 n

这就是桶排序时间复杂度接近于n 的证明了

代码实现

用代码实现桶,首先想到的就是散列表,不过散列函数不再是取余,而是散列函数的值等于自变量本身,即 key = hash(key). 解决冲突的方式是链表,也即用链表的物理存储方式来表示一个桶

下面看代码:

const _tongSort = (array, hashArray) => {
    for (let i = 0; i length; i++) {
        const hashIndex = array[i];
        const temp = { value: hashIndex, next: null };
        if (!hashArray[hashIndex]) {
            hashArray[hashIndex] = temp;
        } else {
            temp.next = hashArray[hashIndex];
            hashArray[hashIndex] = temp;
        }
    }
    return hashArray;
};

const tongSort = (array, maxValue) => {
    const hashArray = Array(maxValue + 1).fill(null);
    return _tongSort(array, hashArray);
};

这段代码定义了两个函数:_tongSorttongSort

_tongSort 函数用于实现桶排序算法, 它的输入参数是一个数组 array 和一个哈希数组 hashArray。函数的实现方式是遍历数组中的每个元素, 将这个元素放到对应的桶中,这里的桶是用链表的方式表示的。桶没有初始化,就创建一个桶,如果已经有了桶,并且桶中已经有了其他的元素,就使用头插法插链表中。

tongSort 函数是同排序算法的入口函数,它的输入参数是一个数组 array 和一个最大值 maxValue。函数的实现方式是创建一个长度为 maxValue + 1 的哈希数组 hashArray,然后将 _tongSort 函数的返回值作为 hashArray 的值。最后返回 hashArray

桶排序比较特殊,他需要预先知道所排序元素的最大值,这样才能生成对应的 hashArray。这在实际排序场景是没有问题的。并且所排序的元素对象的值不能太大,否则不能使用。桶排序仅支持正整数,小数也不能支持。不过对于不满足条件的数,可以做些处理,比如小数可以放大变成整数,负数可以用移码的策略变成正数等

正是因为桶排序的限制如此的多,所以语言排序 API 的底层实现通常是快速排序,或者是归并排序

测试代码:

const data = [32, 45, 12, 34, 35, 42, 324, 123, 21, 23];

const sortedArray = tongSort(data, 324);

const printSortedArray = (hashArray) => {
    for (let i = 0; i length; i++) {
        if (hashArray[i]) {
            let temp = hashArray[i];
            while (temp) {
                console.log(temp.value);
                temp = temp.next;
            }
        }
    }
};

printSortedArray(sortedArray);
// 12
// 21
// 23
// 32
// 34
// 35
// 42
// 45
// 123
// 324

在调用sortedArray之后,得到了一个 hashArray,这个数组还不能直接使用,需要一个辅助函数。上面代码中使用了打印的辅助函数printSortedArray。可以看到打印结果是没有问题的。

总结

这篇文章分享了桶排序,桶排序的实现,复杂度分析,以及使用场景,使用限制等等,如果用hash表来实现的话,桶排序是不是叫hash排序更合适呢?

以上就是js前端算法实现桶排序代码的全部内容,希望对你有帮助!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/6352.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

270
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

108
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

684
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

340
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

372
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

844
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号