冒泡排序
思想:
- 当前项和后一项进行比较 如果当前项大于后一项则 交换位置
var arr = [29, 10, 34, 40, 18]; function bubbleSort(arr) { for (var i = 0; i < arr.length - 1; i++){ for (var j = 0; j < arr.length - 1 - i; j++){ var num = arr[j]; if(arr[j] > arr[j + 1]){ arr[j] = arr[j + 1]; arr[j + 1] = num; } } } return arr; } bubbleSort(arr) // [10, 18, 29, 34, 40]复制代码
插入排序
思想:
- 插入排序是从后往前比较, 从第二项开始一次往前比较 如果当前项大于前一项 则停止比较并将当前项插入到前一项的后面
function insertC(A) { for (let i = 1; i < A.length; i++) { // p 指向 下一个要比较的索引 let p = i - 1 // 当前要插入项 let cur = A[i] // 只要前一项大于当前项就一直循环下去 while(p >= 0 && A[p] > cur) { // 前一项大于当前项 就将前一项往后挪一位 A[p + 1] = A[p] // 每比较完一次 p存储的索引值 就往前挪一位 进行下次比较 p-- } // 执行到这一行 说明 当前项cur 大于索引p这一项 // 则将当前项插入到后面 A[p + 1] = cur } } const A5 = [2, 4, 13, 6, 3] insertC(A5) console.log(A5) // [ 2, 3, 4, 6, 13 ]复制代码
快速排序
思想:
- 在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
- 将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边
- 对左右两个分区重复以上步骤直到所有元素都是有序的
var arr = [29, 10, 34, 40, 18]; function qu(ary) { if (ary.length <= 1) return ary; var centIndex = Math.floor(ary.length / 2); var left = []; var right = []; var centNum = ary.splice(centIndex, 1)[0]; for(var i = 0; i< ary.length; i++){ if(ary[i] < centNum) { left.push(ary[i]); }else { right.push(ary[i]); } } return qu(left).concat(centNum, qu(right)); } console.log(qu(arr));// [10, 18, 29, 34, 40]复制代码
选择排序
思想:
- 拿出用数组第一项与数组的第二次开始一次比较,将最小的那一项的索引值[min]保存,然后再将数组的第一项索引为[0]与这个最小值兑换位置。(第一次循环找出数组中最小的放在第一位)
- 让后再拿出数组第二项,与数组的第三项开始找出数组中第二小的值的索引[min],然后与数组中第二项索引为[1]的互换位置。
- ......
var arr = [3, 2, 4, 7, 1, 5, 9, 6, 8]; var min; for (var i = 0; i < arr.length - 2; ++i) { var temp = arr[i]; min = i; for (var j = i + 1; j < arr.length - 1; ++j) { if (arr[j] < arr[min]) { min = j } } arr[i] = arr[min]; arr[min] = temp; } console.log(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]复制代码
希尔排序
希尔排序: 他是首先比较最远的元素而非相邻的元素,让元素尽快回到正确的位置通过定义一个间隔序列来表示在排序过程中进行比较的元素间隔。公开的间隔序列为 701, 301, 132, 57, 23, 10, 4, 1
var arr = [3, 2, 4, 7, 1, 5, 9, 6, 8];var gops = [5, 3, 1];for(var g=0; g=gops[g] && arr[j-gops[g]]>temp;j-=gops[g]){ arr[j] = arr[j-gops[g]]; } arr[j] = temp }}console.log(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]复制代码