# JS算法

# 冒泡排序

  • 核心思想

让数组中的当前项和后一项进行比较,如果当前项比后一项大,则两项交换位置(让大的靠后)即可

var arr = [2,3,1,8,7,6]

function bubble(arr){
    // 外层循环 i 控制比较的轮数 (例如:5个数的数组,只要循环4次,最后剩下一个不用比较)
    for(let i = 0; i < arr.length - 1; i++){

        // 里层循环每一轮控制比较的轮数 (扣掉自己: -1, 扣掉已经冒泡到最后的个数 i)
        for(let j = 0; j < arr.length - 1 - i; j++){
            let left = arr[j], right = arr[j+1];
            if(arr[j]>arr[j+1]){
                arr[j+1] = left;
                arr[j] = right;
            }
        }
    }
    return arr
}

# 插入排序

  • 核心思想

以拿扑克牌为例, 每次摸新牌都和手里都牌从小到大进行比较,若新牌比手上的某张牌小,就在当前位置插入这张新牌,若比到最后手上没有比新牌大的,就把新牌放在最后。

function insert(arr){
    var handle = [];
    handle.push(arr[0])

    for (let i = 1; i < arr.length; i++) {
       for(let j = 0; j<handle.length; j++){
        if(arr[i]<handle[j]){
            handle.splice(j, 0, arr[i]);
            break
        }
        handle.push(arr[i])
       }
        
    }
    return handle
}

# 快速排序

  • 核心思想

从数组中拿出中间项,剩下的每一项和这个中间项比较,小的放左边,大的放右边,如此反复。

function quick(arr){
    // 如果 arr 只有一个数或者没有,就返回本身
    if(arr.length <= 1){
        return arr
    }
     // 1. 找到数组中间项,并在原数组把它移除

     let middleIndex = Math.floor(arr.length / 2)
     let middleVal = arr.splice(middleIndex, 1)[0]

     // 2. 准备左右两个数组,循环剩下数组中的每一项,比当前项小的放到左边数组,大的放到右边数组
     let left = [], right = [];

     for(let i = 0; i<arr.length; i++){
        if(arr[i]<middleVal){
            left.push(arr[i])
        } else {
            right.push(arr[i])
        }
     }
     
     // 递归
     return quick(left).concat(middleVal, quick(right))
}