# 排序

# 冒泡排序

未处理过的元素,经过对比,将最大或者最小的元素,依次放到未排序元素的起始位置

const arr = [4,5,1,2,6,3]
const len = arr.length
for(let i = 0; i < len-1; i++){
    for(let j = 0; j < len - i -1; j++ ){
        if(arr[j]>arr[j+1]) [arr[j],arr[j+1]] = [arr[j+1],arr[j]]
    }
}

# 选择排序

在未排序的元素中,找到最大/最小值,放到未排序元素的起始位置。

const arr = [4,5,1,2,6,3]
const len = arr.length
let minIndex
for(let i = 0; i < len - 1; i++){
    minIndex = i
    for(let j = i+1; j < len; j++){
        if(arr[minIndex]>arr[j]){
            minIndex = j
        }
    }
    [arr[i],arr[minIndex]] = [arr[minIndex],arr[i]]
}

# 插入排序

未排序的数列,在已排序中,从前向后扫描,找到对应位置插入。

const arr = [4,5,1,2,6,3]
const len = arr.length
for(let i = 1; i < len ; i++){
 let preIndex = i-1;
 let current = arr[i]
 while(preIndex >=0 && arr[preIndex] > current){
     arr[preIndex+1] = arr[preIndex]
     preIndex--
 }
 arr[preIndex+1] = current
}

# 快速排序

在数列中选择一个数字作为基准,然后小于基准的放到左边,大于基准的放到右边,再在基准左右列表的数列中,进行重复操作。

const arr = [4,5,1,2,6,3]
function quickSort(arr){
    const len = arr.length
    if(len <= 1) return arr;
    const pivotIndex = Math.floor(len/2)
    const pivot = arr.splice(pivotIndex,1)[0];
    const left = []
    const right = []
    for(let i = 0; i < len; i++){
        if(i !== pivotIndex) {
            if(arr[i]<pivot) {left.push(arr[i])}else{
                right.push(arr[i])
            }
        }
    }
    return quickSort(left).concat([pivot],quickSort(right))
}