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


冒泡排序

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

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;
}

我們可以看到,上面代碼片段中設置了temp,它是用來做什么的呢?用于標記一次循環時是否發生了交換。也就是說,如果在一趟循環結束后,沒有發生任何交換,也就是說現在已經是升序了,不需要再排了,可以結束了,這樣就有效的降低了時間復雜度。

快速排序

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

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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容