算法打卡day1——冒泡、选择、快排

57 阅读1分钟

冒泡排序:(把大的移到后面)

【最坏和平均度为O(n^2);可通过添加flag判断当前轮是否已经有序来终止,最好为O(n)】

function bubbleSort(arr){
    for(let i = 0; i < arr.length-1; i ++){
        for(let j = 0; j < arr.length-1-i; j ++){
            if(arr[j] > arr[j+1]){
                let temp = arr[j+1]
                arr[j+1] = arr[j]
                arr[j] = temp
            }
        }
    }
    return arr
}

选择排序:(始终让idx前面有序)

【三项均为O(n^2)】

function selectionSort(arr){
    for(let i = 0; i < arr.length-1; i ++){
        let idx = i
        for(let j = i+1; j < arr.length; j ++){
            if(arr[j] < arr[idx]){
                idx = j
            }
        }
        let temp = arr[idx]
        arr[idx] = arr[i]
        arr[i] = temp
    }
    return arr
}

快速排序:(找一个分界点,大于左边、小于右边,分治思想)

【最坏O(n^2),最好和平均O(nlogn)】

function quickSort(arr){
    const pivot = Math.floor(Math.random() * arr.length)
    const left = []
    const right = []
    const base = arr.splice(pivot,1)[0]
    for (let i = 0; i < arr.length; i++) {
        if (nums[i] < base) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat([base],quickSort(right))
}

这里写的是out-place版本,我觉得最好理解。追求省内存可以使用in-place版本。

同时第二行代码是一个随机化优化。