排序算法收集

86 阅读1分钟

1. 冒泡排序

  1. 遍历数组,比较相领的两位,大的放在后面(如果结果是从大到小,就小的放后面)
  2. 第一趟比较n个,第二趟比较n-1个(最后不是最大就是最小),直到剩下一个
function bubbleSort(arr) {
    let leng = arr.length;
    let temp;
    for (let i = 0; i < leng; i++) {
        for (let j = 0; j < leng - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    return arr;
}

let arr = [1, 2, 3, 4, 5, 8, 6, 2, 5, 1];
console.log(bubbleSort(arr));

2. 插入排序

  1. 从第二位开始遍历
  2. 当前值与前面的值依次比较(从后往前),大的向后移动一位,直到遇到比当前值小的或比较完。
  3. 当前位置放入遇到的小的值后面或者最前面
  4. 上面这么操作后当前值前面的值就都是从小到大排列了
function insertionSort(arr) {
    let len = arr.length;
    let preIndex, current;
    for (let i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while (preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex + 1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex + 1] = current;
    }
    return arr;
}

let arr = [2, 4, 5, 3, 7, 5];
console.log(insertionSort(arr));

3.快速排序

  1. 递归
  2. 每次从数组中取一个值base,遍历数组。
  3. 将值与 base 比较,大的放入右边数组,小的放入左边数组。
  4. 返回左边、base、右边的合并数组
function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }

    let leng = arr.length;
    let baseNumber = Math.floor(leng / 2);
    let base = arr.splice(baseNumber, 1);
    let left = [];
    let right = [];

    for (let i = 0; i < arr.length; i++) {
        if (arr[i] < base) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }

    return quickSort(left).concat(base, quickSort(right));
}

let arr = [5, 2, 8, 6, 4, 7, 9, 5, 3];
console.log(quickSort(arr));

4.选择排序

  1. 从前往后遍历
  2. 将当前值与后面的依次比较,大的话两个位置值交换
  3. 直到遍历结束,结果就会使从大到小或者从小到大
function selectionSort(arr) {
    for (let i = 0; i < arr.length - 1; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
                let temp = arr[j]
                arr[j] = arr[i]
                arr[i] = temp
            }
        }
    }
    return arr;
}

let arr = [2, 1, 3, 5, 4, 6, 8];
console.log(selectionSort(arr));

5. 二分排序

  1. 递归函数fn
  2. 创建左右数组,取一个值,遍历数组,小的放入左数组,大的放入右数组
  3. 返回fn(左数组).concat(中间值, fn(右数组))
function fn(arr) {
    if(arr.length<=1){
        return arr;
    }
    let middle = arr[0];
    let leftArr = [];
    let rightArr = [];
    for(let i=1; i<arr.length;i++){
        if(arr[i]<middle){
            leftArr.push(arr[i])
        }else{
            rightArr.push(arr[i])
        }
    }
    return fn(leftArr).concat(middle, fn(rightArr))
}