多一些Aha Time,发现技术的美妙�|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【算法基础】15.十大排序算法——桶排序

参考资料

桶排序https://zhuanlan.zhihu.com/p/417628400

桶排序算法详解https://blog.csdn.net/qq_35344198/article/details/107378626

 

直观理解

宏观上分组,每个组内再进行元素级的排序

 

例子先行

 使用一段暂时还不知道是什么语言的代码作演示,不再重新实现

复制代码
 1 // 冒泡排序,桶内元素排序时使用到
 2 function bubbleSort(arr) {
 3     let length = arr.length;
 4     // 优化2,记录无序数列的边界,每次比较只需要比到这里为止
 5     let lastExchangeIndex = 0;
 6     let sortBorder = length - 1;
 7     for (let i = 0; i < length - 1; i++) {
 8         // 优化1,isSorted判断是否有序,已经有序,不需要再继续交换
 9         let isSorted = true;
10         for (let j = 0; j < sortBorder; j++) {
11             if (arr[j] > arr[j + 1]) {
12                 [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
13                 isSorted = false;
14                 lastExchangeIndex = j;
15             }
16         }
17         sortBorder = lastExchangeIndex;
18         if (isSorted) {
19             break;
20         }
21     }
22 }
23 
24 // 桶排序
25 function sort(arr) {
26     // 得到数列的最大值、最小值,并计算差值d
27     let max = arr[0];
28     let min = arr[0];
29     for (let item of arr) {
30         if (item > max) {
31             max = item;
32         }
33         if (item < min) {
34             min = item;
35         }
36     }
37     let d = max - min;
38 
39     // 初始化桶
40     let bucketNum = 5;
41     let bucketArr = [];
42     for (let i = 0; i < bucketNum; i++) {
43         bucketArr.push([]);
44     }
45 
46     // 遍历原始数组,将原始放入桶中
47     for (let item of arr) {
48         let index = parseInt((item - min) * bucketNum / d);
49         if (index === bucketNum) {
50             index--;
51         }
52         bucketArr[index].push(item);
53     }
54 
55     // 对每个桶进行排序,这里用了冒泡排序法
56     for (let itemArr of bucketArr) {
57         bubbleSort(itemArr);
58     }
59 
60     // 遍历桶,得到排序后结果
61     let index = 0;
62     let sortArr = [];
63     for (let itemArr of bucketArr) {
64         for (let item of itemArr) {
65             sortArr[index++] = item;
66         }
67     }
68 
69     return sortArr;
70 }
71 
72 let arr = [11, 38, 8, 34, 27, 19, 26, 13];
73 let sortArr = sort(arr);
74 console.log(sortArr);
复制代码

 

 

总结提炼

 1和计数排序一样属于牺牲空间换取时间,要把控住牺牲空间的程度;

桶的个数和大小都是人为设置的 ,而每个桶又要避免空桶的情况。所以在使用桶排序的时候既需要对待排序数列要求偏均匀 ,又要要求桶的设计兼顾效率和空间;

2 复杂度和稳定性

(1)时间复杂度和桶内排序的算法选取有关

(2)空间复杂度,桶排序算法排序过程中新建了一个桶和一个输出数组,所以算法的空间复杂度是O(N+M)

(3)取决于桶内排序算法的选取

 

拓展方向

 暂无

本文作者:OhOfCourse

本文链接:https://www.cnblogs.com/OhOfCourse/p/16919261.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起