本文内容来自《啊哈算法》一书,记录学习过程
桶排序
桶排序的原理是将数组分到优先的桶里,然后对每个桶进行排序,最后将各个桶中的数据有序的合并起来。
- 最快
当输入数据可以均匀的分配到每个桶中
- 最慢
当输入的数据被分配到同一个桶中
- 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function main(arr, arrSize) { var ArrSize = arrSize + 1; var a = new Array(ArrSize); for (var i = 0; i <= ArrSize; i++) { a[i] = 0; } arr.forEach(item => { a[item]++; }); var nextArr = []; for (var i = arrSize; i >= 0; i--) { for (var j = 0; j < a[i]; j++) { nextArr.push(i); } } return nextArr; } main([1, 2, 3, 5, 4], 10);
|
冒泡排序(前后两两比较)
冒泡排序的基本思想是:每次比较相邻的元素,如果他们的顺序错误就把他们交换过来
其原理是:每次排列一趟只能讲一个数归位,即第一趟只能讲末位上的数归位,
例如将 12 35 99 18 76 这五个数组从大到小排列顺序。
第一次循环 [35,99,18,76,12]
第二次循环 [99,35,76,18,12]
第三次循环 [99,76,35,18,12]
底四次循环 [99,76,35,18,12]
冒泡排序的原理是,每一趟只能确定一个数的归位,即第一趟只能将末位上的数归位,第二趟只能将倒数第二位归位,第三趟只能将倒数第三位归位以此类推,直至完成。
总结就是如果有 N 个数进行排序,只需将 N-1 个数归位,也就是需要 N-1 趟操作。而每一趟都需要从第一位开始进行相邻两位数的比较,将较小的一个数放到后面,比较完毕后向后挪以为继续比较下面两个相邻数的大小,重复此步骤直至结束。
看一下代码怎么实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function main(arr) { for (var i = 0; i < arr.length - 1; i++) { for (var j = i + 1; j < arr.length; j++) { var cur = arr[i]; if (cur < arr[j]) { var index = arr[j]; arr[j] = cur; arr[i] = index; } } } return arr; } main([9, 1, 2, 5, 7]);
|
快速排序
快速排序是针对冒泡排序的一种改进,也是一种最常用的排序。
从数组中哪一个值,然后通过这个值挨个和数组里面的值进行比较,如果大于的放一边,小于的放另一边,然后把这些合并起来在进行比较,如此反复即可完成排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function quickSort(arr) { if (arr.length <= 1) return arr; var pivotIndex = Math.floor(arr.length / 2); var pivot = arr.splice(pivotIndex, 1)[0]; var left = []; var right = []; for (var i = 0; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); } quickSort([2, 3, 6, 5, 4, 1, 25, 4]);
|