JavaScript版快速排序算法實現

1. 遞歸方式

const ints = [1, -1, 23, -23, 434]
console.log('排序前數組', ints)
quickSort(ints, 0, ints.length - 1)
console.log('排序后數組', ints)

function swap(arr, aIndex, bIndex) {
    const temp = arr[aIndex]
    arr[aIndex] = arr[bIndex]
    arr[bIndex] = temp
}

function quickSort(arr, left, right) {
    if (left > right) {
        return
    }
    // 獲取一個參考值的索引(這里選擇數組中間位置的元素作為參考值,也可以隨機選擇一個)
    const mid = left + (right - left >>> 1)
    // 將參考值交換到數組的最左側
    swap(arr, left, mid)
    // 用于記錄有多少個值比參考值小
    let j = left
    // 開始處理數組, 比參考值小的  將其移動到數組的左側
    for (let i = left + 1; i <= right; i++) {
        // 將數組值依次與數組[最左側]的參考值進行比較
        if (arr[i] < arr[left]) {
            // 比參考值小   個數加一
            j++
            // 將比參考值小的元素交換到數組的左側來
            swap(arr, i, j)
        }
    }
    // 最后將數組最左側的參考值交換到他最終排序好的位置去
    swap(arr, left, j)
    // 然后將參考值左側的數組和參考值右側的數組繼續進行上述操作
    quickSort(arr, left, j - 1)
    quickSort(arr, j + 1, right)
}

2. 循環方式

const ints = [43, 0, -1, 56, 100, -245]
console.log('排序前數組', ints)
quickSort(ints)
console.log('排序后數組', ints)

function swap(arr, aIndex, bIndex) {
    const temp = arr[aIndex]
    arr[aIndex] = arr[bIndex]
    arr[bIndex] = temp
}

function quickSort(arr) {
    if (arr.length <= 1) {
        return
    }
    const st = []
    st.push(0)
    st.push(arr.length - 1)
    while (st.length > 0) {
        // 因為棧是先進后出,先推入的是左側的下標
        // 所以推出的時候就先是右側的下標
        const right = st.pop()
        const left = st.pop()
        // 獲取一個參考值的索引(這里選擇數組中間位置的元素作為參考值,也可以隨機選擇一個)
        const mid = left + (right - left >>> 1)
        // 將參考值交換到數組的最左側
        swap(arr, left, mid)
        // 用于記錄有多少個值比參考值小
        let j = left
        // 開始處理數組, 比參考值小的  將其移動到數組的左側
        for (let i = left + 1; i <= right; i++) {
            // 將數組值依次與數組[最左側]的參考值進行比較
            if (arr[i] < arr[left]) {
                // 比參考值小   個數加一
                j++
                // 將比參考值小的元素交換到數組的左側來
                swap(arr, i, j)
            }
        }
        // 最后將數組最左側的參考值交換到他最終排序好的位置去
        swap(arr, left, j)
        // 然后將參考值左側的數組和參考值右側的數組繼續進行上述操作
        if (left < j - 1) {
            st.push(left)
            st.push(j - 1)
        }
        if (right > j + 1) {
            st.push(j + 1)
            st.push(right)
        }
    }
}

3. 運行結果

C:\Users\admin\Desktop>node quickStort.js
排序前數組 [ 43, 0, -1, 56, 100, -245 ]
排序后數組 [ -245, -1, 0, 43, 56, 100 ]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容