js演算法 快速排序 Quicksort

2022-08-21 22:30:18 字數 2591 閱讀 6325

快速排序(英語:quicksort),又稱劃分交換排序(partition-exchange sort),簡稱快排,一種排序演算法,最早由東尼·霍爾提出。在平均狀況下,排序n個專案要o(nlogn)次比較。在最壞狀況下則需要o(n^2)次比較,但這種狀況並不常見。事實上,快速排序o(nlogn)通常明顯比其他演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地達成
快速排序可能大家都學過,在面試中也經常會遇到,哪怕你是做前端的也需要會寫,這裡會列舉兩種不同的快排**進行分析

從陣列中選擇乙個元素作為基準點

排序陣列,所有比基準值小的元素擺放在左邊,而大於基準值的擺放在右邊。每次分割結束以後基準值會插入到中間去。

最後利用遞迴,將擺放在左邊的陣列和右邊的陣列在進行一次上述的1和2操作。

為了更深入的理解,可以看下面這張圖

我們根據上面這張圖,來用文字描述一下

選擇左右邊的元素為基準數,7

將小於7的放在左邊,大於7的放在右邊,然後將基準數放到中間

然後再重複操作從左邊的陣列選擇乙個基準點2

3比2大則放到基準樹的右邊

右邊的陣列也是一樣選擇12作為基準數,15比12大所以放到了12的右邊

最後出來的結果就是從左到右 2 ,3,7,12,15了

以上就是快速排序基本的乙個實現思想。

這是我最近看到的一種快排**

var quicksort = function(arr) 

var pivotindex = math.floor(arr.length / 2);

var pivot = arr.splice(pivotindex, 1)[0];

var left = ;

var right = ;

for (var i = 0; i < arr.length; i++) else

} return quicksort(left).concat([pivot], quicksort(right));

};

以上**的實現方式是,選擇乙個中間的數字為基準點,用兩個陣列分別去儲存比基準數小的值,和比基準數大的值,最後遞迴左邊的陣列和右邊的陣列,用concat去做乙個陣列的合併。

對於這段**的分析:

缺點:優點:

那麼我們接下來用另外一種方式去實現快速排序

從上面這張圖,我們用乙個指標i去做了乙個分割

下面我們來看一下**的實現,整個**分成三部分,陣列交換,拆分,qsort(主函式)三個部分

先寫最簡單的陣列交換吧,這個大家應該都懂

function swap(a, i ,j)
下面是拆分的過程,其實就是對指標進行移動,找到最後指標所指向的位置

/**

* * @param a 陣列

* @param p 起始下標

* @param r 結束下標 + 1

*/ function dvide(a, p, r)

}// 最後將基準點插入到i+1的位置

swap(a, i+1, r-1);

// 返回最終指標i的位置

return i+1;

}

主程式主要是通過遞迴去重複的呼叫進行拆分,一直拆分到只有乙個數字。

/**

* * @param a 陣列

* @param p 起始下標

* @param r 結束下標 + 1

*/function qsort(a, p, r)

return a;

}

function swap(a, i, j) 

/** *

* @param a 陣列

* @param p 起始下標

* @param r 結束下標 + 1

*/function divide(a, p, r)

} swap(a, i + 1, r - 1);

return i + 1;

}/**

* * @param a 陣列

* @param p 起始下標

* @param r 結束下標 + 1

*/function qsort(a, p = 0, r)

return a;

}

第二段的排序演算法我們減少了兩個o(n)的操作,得到了一定的效能上的提公升,而第一種方法資料規模足夠大的情況下會相對來說比較慢一些,快速排序在面試中也常常出現,為了筆試更好寫一些可能會有更多的前端會選擇第一種方式,但也會有一些為難人的面試官提出一些演算法中的問題。而在實際的專案中,我覺得第一種方式可以少用。

js資料結構-鍊錶

js資料結構-佇列

js資料結構-二叉樹(二叉堆)

js資料結構-二叉樹(二叉搜尋樹)

js快速排序演算法

演算法 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。動畫演示 點我檢視效果 實現 function quicksort array hight 從左往右找,直到找到乙個大於基準的...

JS排序演算法之快速排序

快速排序和歸併排序都是採用二分法的排序演算法。都是 olog n 不過快速排序更複雜一些。快遞排序跟歸併排序的區別是順序,它是先總後分。不斷地從斷點分,讓左邊的數都小於斷點,右邊都大於斷點。然後迭代切分。1 var group 1,9,3,5,0,4,2,8 23 function swap k,y...

js的 快速排序 演算法

快速排序的原理 選擇陣列中的隨便乙個元素作為基準,遍歷陣列,將大於它的元素放在右邊,小於他的元素放在左邊。然後對左右兩邊的陣列繼續執行如上操作,如此遞迴直到左右兩邊的陣列為1。js簡單實現 var quicksort function arr var pivotindex math.floor ne...