JS書寫冒泡排序和快速排序


冒泡排序

先說冒泡,這個原理最簡單,其實一趟冒泡要做的事情就是“把最重的泡泡沉到底下去”,也就是一趟排序要找出最大的數(shù),那怎么實現(xiàn)呢?用當(dāng)前數(shù)字和下一個數(shù)字做比較,如果當(dāng)前>下一個,進(jìn)行值交換,自然就可以通過一次循環(huán)找到最大的數(shù)。
那么我們需要控制的就是循環(huán)次數(shù),這個當(dāng)然是用數(shù)組長度來控制,一趟冒泡后,循環(huán)次數(shù)減一,看下面一段代碼:

function bubbleSort(arr) {
    const end = arr.length - 1;

    for (let i = end; i >= 0; i--) {
        let temp = 0;

        for (let k = 0; k < i; k++) {
            if (arr[k] > arr[k + 1]) {
                arr[k] = arr[k] + arr[k + 1] - (arr[k + 1] = arr[k]);
                temp = 1;
            }
        }
        if (temp == 0) {
            break;
        }
    }

    return arr;
}

我們可以看到,上面代碼片段中設(shè)置了temp,它是用來做什么的呢?用于標(biāo)記一次循環(huán)時是否發(fā)生了交換。也就是說,如果在一趟循環(huán)結(jié)束后,沒有發(fā)生任何交換,也就是說現(xiàn)在已經(jīng)是升序了,不需要再排了,可以結(jié)束了,這樣就有效的降低了時間復(fù)雜度。

快速排序

快排的思想想必大家也都知道,在一次排序后,數(shù)字a的左邊都是比它小的,右邊都是比它大的。然后對左邊和右邊的數(shù)字做同樣的操作。比如我們先選擇第一個數(shù)a,然后對數(shù)組進(jìn)行循環(huán),遇到比a大的就不管,遇到比a小的就和上一個比a大的數(shù)進(jìn)行交換,數(shù)組循環(huán)完畢后,將a與當(dāng)前正在比對的值進(jìn)行交換,就可以實現(xiàn)“左邊<a<右邊”,然后對左邊右邊的數(shù)據(jù)遞歸排序,具體代碼如下:

function quickSort(arr, start, end) {
    let m = start;

    if (start >= end) {
        return;
    }

    for (let i = start + 1; i <= end; i++) {
        if (arr[i] < arr[start]) {
            m++;
            arr[i] = arr[i] + arr[m] - (arr[m] = arr[i]);
        }
    }

    arr[start] = arr[start] + arr[m] - (arr[m] = arr[start]);
    quickSort(arr, start, m - 1);
    quickSort(arr, m + 1, end);

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

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

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