看这篇博客 非常详细 https://www.cnblogs.com/AlbertP/p/10847627.html
1 .冒泡排序
function bubbleSort(arr) { let len = arr.length for (let i = 0; i < len; i++) { for (let j = 0; j < len; j++) { if (arr[j] > arr[j + 1]) { //相邻元素两两对比 let temp = arr[j + 1] //元素交换 arr[j + 1] = arr[j] arr[j] = temp } } } return arr }
为什么 第二个循环要 - 1 - i
因为 整体循环一次就是选取了一个最大值在最后,所以每一次子循环就可以减少一次对比,所以减去一个父循环的索引 “i”, 减1 是因为子循环判断。 【j+1】= j 子循环到倒数第二个的时候已经做了最后一个排序 所以 并不需要再进行length长度的排序
其实 len-i-1 都是为了减少不必要的运算 不减也可以
function ppp (arr){ let len = arr.length for (let i = 0; i < len; i++) { for (let j = 0; j < len; j++) { if (arr[j] > arr[j+1]) { //相邻元素两两对比 let temp = arr[j + 1] //元素交换 arr[j + 1] = arr[j] arr[j] = temp } } } return arr }
感兴趣可以尝试下
相应的可以推倒 从大到小排序
function ccc (arr){ let len = arr.length for (let i = 0; i < len; i++) { for (let j = len ; j > 0 + i - 1; j--) { if (arr[j] > arr[j-1]) { //相邻元素两两对比 let temp = arr[j - 1] //元素交换 arr[j - 1] = arr[j] arr[j] = temp } } } return arr }
因为中间的条件是 j>0 所以 let j = len - i 当然 和上一个一样。。可以直接 j = len3
但是!!!!!!!!!!!!!
平时做项目 一般排序都是用 sort排序 从大到小
console.log(arr.sort((a, b) => { return a - b }))
从小到大
console.log(arr.sort((a, b) => { return b - a }))
2 选择排序
function selectionSort(arr) { var len = arr.length; var minIndex, temp; for (var i = 0; i < len - 1; i++) { minIndex = i; for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { //寻找最小的数 minIndex = j; //将最小数的索引保存 } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } return arr; }
这个很好理解, 例如 数组 [3,2,1,4] 父级循环 从3开始比对 比对出第一个数 是2 因为 j = i +1 ;
2<3 成立 所以 minIndex = j = 1 子循环继续 j = 2 arr[j] = 1 1<2 成立 minIndex = j = 2 逐个比对完毕
子循环结束。。第一轮父级循环 temp = 3 arr[0] = arr[2] arr[2] = temp = 3 交换了位置 (文字解释真的有点累 感兴趣直接运行爽快 干脆)
这个选择排序 重点突出的是 互换原则
这个函数也是从小到大排序。。同理可以推论从大到小排序。。 把 子循环的< 换成 > 号即可。。。
还是但是。。正常项目中推荐 sort 几行代码搞定排序