冒泡排序、選擇排序、插入排序、快速排序

冒泡排序

思路

需要遍歷 length - 1 次
每一次遍歷
都從后往前進(jìn)行比較,
相鄰的兩兩比較大小,小的向前浮動(dòng)
時(shí)間復(fù)雜度 O(n2)

function bubbleSort(target) {
    let temp = null

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

        console.log(`第 ${i + 1} 次排序`)
    }

    return target
}

console.log(bubbleSort([23, 32, 5, 72, 12, 1]))
運(yùn)行結(jié)果

缺點(diǎn):

當(dāng)目標(biāo)對(duì)象是已經(jīng)排序好的數(shù)據(jù)
也需要進(jìn)行多次遍歷

console.log(bubbleSort([1, 2, 3, 4, 5, 6]))
運(yùn)行結(jié)果

優(yōu)化

定義一個(gè)布爾值
在遍歷每一次的時(shí)候,如果發(fā)生位置交換,就改變布爾值
當(dāng)這一次循環(huán)結(jié)束之后,判斷該布爾值是否變化
變化了則繼續(xù)下一次,沒(méi)變則退出

function bubbleSort(target) {
    let temp = null
    let flag = false

    for(let i = 0; i < target.length - 1; i++) {
        for(let j = target.length - 1; j > i; j--) {
            if (target[j] < target[j - 1]) {
                temp = target[j]
                target[j] = target[j - 1]
                target[j - 1] = temp
                flag = true
            }
        }

        console.log(`第 ${i + 1} 次排序`)
        if (!flag) break
    }

    return target
}

console.log(bubbleSort([1, 2, 3, 4, 5, 6]))
運(yùn)行結(jié)果

選擇排序

遍歷 length - 1 次
從左到右開(kāi)始找,每遍歷一次將最小值跟當(dāng)前遍歷的第一個(gè)元素交換
時(shí)間復(fù)雜度 O(n2)

function selctionSort(target) {
    for (let i = 0; i < target.length - 1; i++) {
        let min = target[i]
        let minIndex = i

        for (let j = i + 1; j < target.length; j++) {
            if (target[j] < min) {
                min = target[j]
                minIndex = j
            }
        }

        console.log(`第${i + 1}次循環(huán)`, target)
        // 減少循環(huán)次數(shù)
        if (minIndex === i) break
        target[minIndex] = target[i]
        target[i] = min
    }

    return target
}

console.log(selctionSort([23, 32, 5, 72, 12, 1]))
console.log(selctionSort([1, 2, 3, 4, 5, 6])) 
運(yùn)行結(jié)果

插入排序

遍歷 length - 1 次
從 i + 1 項(xiàng)開(kāi)始往前遍歷,兩兩比較小的往前移動(dòng),
時(shí)間復(fù)雜度 O(n2)

function insertionSort(target) {
    let temp

    for (let i = 0; i < target.length - 1; i++) {

        for (let j = i + 1; j > 0; j--) {
            if (target[j] < target[j - 1]) {
                temp = target[j - 1]
                target[j - 1] = target[j]
                target[j] = temp
            } else {
                // 當(dāng)不小于已排序好的最大值時(shí)
                // 退出每次遍歷,進(jìn)行下一次
                break
            }
        }

        console.log(`第${i + 1}次循環(huán)`, target)
    }

    return target
}
console.log(insertionSort([23, 32, 5, 72, 12, 1]))
運(yùn)行結(jié)果

快速排序

/**
 參數(shù)說(shuō)明
 target 需要排序的目標(biāo)數(shù)組
 l  需要排序的起始項(xiàng)
 r  需要排序的終止項(xiàng)
 */
function quickSort(target, l, r) {
    if (l >= r) return

    let i = l; let j = r; let key = target[l];//選擇第一個(gè)數(shù)為key

    while (i < j) {

        while (i < j && target[j] >= key)//從右向左找第一個(gè)小于key的值
            j--;
        if (i < j) {
            target[i] = target[j];
            i++;
        }

        while (i < j && target[i] < key)//從左向右找第一個(gè)大于key的值
            i++;

        if (i < j) {
            target[j] = target[i];
            j--;
        }
    }
    //i == j
    target[i] = key;
    quickSort(target, l, i - 1);//遞歸調(diào)用
    quickSort(target, i + 1, r);//遞歸調(diào)用
    return target
}

console.log(quickSort([23, 32, 5, 72, 12, 1, 2], 0, 5))
console.log(quickSort([23, 32, 5, 72, 12, 1], 4, 5))
運(yùn)行結(jié)果

【筆記不易,如對(duì)您有幫助,請(qǐng)點(diǎn)贊,謝謝】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 快排上圖中空間復(fù)雜度數(shù)據(jù)錯(cuò)誤,應(yīng)該是O(log n)。 插入,堆,歸并,快排 n表示數(shù)據(jù)規(guī)模,k表示桶的個(gè)數(shù)。n:...
    hadoop_a9bb閱讀 1,696評(píng)論 2 36
  • 2018年10月8日 /*本節(jié)主要內(nèi)容:1、 時(shí)間復(fù)雜度2、冒泡排序3、選擇排序4、插入排序5、對(duì)數(shù)器概念和使用6...
    須臾之北閱讀 825評(píng)論 0 0
  • 一、 選擇排序 選擇排序的基本思想是每次從待排序子表中挑選出最小的元素放在已經(jīng)排好序子表的最后位置,直至全部元素排...
    Y_Stone閱讀 526評(píng)論 0 1
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,356評(píng)論 0 2
  • 經(jīng)典的排序算法 冒泡排序(O(n2)):排序區(qū)間按N、N - 1、N - 2、……、2的規(guī)律變化,有序區(qū)間按1、2...
    雨住多一橫閱讀 733評(píng)論 0 0

友情鏈接更多精彩內(nèi)容