亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript快速排序(quickSort)算法的實現(xiàn)方法總結

 更新時間:2023年11月21日 11:01:48   作者:進二開物  
快速排序的思想式 分治法,選一個基準點,然后根據(jù)大小進行分配,分配然完畢之后,對已經(jīng)分配的進行遞歸操作,最終形成快速排序,所以遞歸也是快速排序思想的一個重要組成部分,本文主要給大家介紹了JavaScript實現(xiàn)快速排序的寫法,需要的朋友可以參考下

什么是快速排序?

快速排序的思想式 分治法。選一個基準點,然后根據(jù)大小進行分配,分配然完畢之后,對已經(jīng)分配的進行遞歸操作,最終形成快速排序。所以遞歸也是快速排序思想的一個重要組成部分。

基本思路

  • 基準點: 選中基準點,一般選擇數(shù)組第一項,當然也可以隨機或者指定數(shù)據(jù)。
  • 分區(qū),一般分為 less/greater 或者 left/right
  • 遞歸: 對已有的分區(qū)經(jīng)進行遞歸操作
  • 合并:將已有的數(shù)據(jù)進行合并

寫法一:基礎寫法

function quickSort(arr) {
    // 數(shù)組小于 1 不用排序,直接返回即可
    if(arr.length <= 1) {
        return arr;
    }
    
    const p = arr[0]; // 選定數(shù)組第一個為基準點
    const left = []; // 左分區(qū)
    const right = []; // 右分區(qū)
    
    // 遍歷給左右分區(qū)
    for(let i = 1; i < arr.length; i++) {
        if(arr[i] < p) {
            // 小于基準點放在左邊
            left.push(arr[i])
        }else {
            // 大于基準點方在右邊
            right.push(arr[i])
        }
    }
    // 合一并且對左右分區(qū),遞歸處理
    
    return quickSort(left).concat(p, quickSort(right))
}

寫法二: 函數(shù)式

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    } else {
        const p = arr[0]; // 確定中間值
        const left = arr.slice(1).filter(x => x <= p);
        const right = arr.slice(1).filter(x => x > p);
        return quickSort(left).concat(p, quickSort(right))
    }
}

使用 filter 過濾,偏向函數(shù)式編程,寫的代碼更加簡潔。

寫法三:隨機基準值

function randomizeQuickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    } else {
        const pi = Math.floor(Math.random() * arr.length); // 隨機基準值索引
        const p = arr[pi];
        const left = arr.slice(0, pi).concat(arr.slice(pi + 1).filter(x => x <= p));
        const right = arr.slice(pi + 1).filter(x => x > p);
        return randomizeQuickSort(left).concat(p, randomizeQuickSort(right))
    }
}

隨機獲取基準值索引,根據(jù)隨機索引獲基準值,所有這兩個已知的值,就可以制作一個隨機索引快速排序了。

寫法四:三分法

function threeWayQuickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    } else {
        const p = arr[0];
        const left = arr.filter(x => x < p);
        const mid = arr.filter(x => x === p); // 獲取所有的中間值,避免重復計算
        const right = arr.filter(x => x > p);
        return threeWayQuickSort(left).concat(mid, threeWayQuickSort(right))
    }
}

三路法,將二路基礎上,將自己看成一個中間數(shù)組,因為與自己相等的可能有很多。這樣就避免了在其他數(shù)組中,還有中間數(shù)據(jù)的重復比較, 一種快速排序的優(yōu)化。

排序算法的使用場景

  • 大規(guī)模數(shù)據(jù)排序速度,比其他的算法要快

復雜度分析

  • 快速排序的平均時間復雜度是 O(n log n) 這種復雜度是比較理想的。O(n log n) 來源是 劃分 O(n)遞歸 O(log n) 的組合。

更難展望

  • 雙軸快速排序
  • 尾遞歸優(yōu)化

小結

文本主要講解常用算法中的快速排序的算法, 快速排序的思想很簡單,就是分與合配合遞歸的思想。選定一個基準值,然后進行對比分離,遞歸這個操作,然后重新配合在一起。當然排序算法也是可以根據(jù)自己的需求進行優(yōu)化的。

相關文章

最新評論