【算法基础】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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步