演算法系列 JavaScript快速排序思想實現

2021-09-14 06:38:17 字數 1466 閱讀 6434

快速排序離不開遞迴的思想,你如果不了解遞迴,可以結合我另外一篇文章來學習 演算法入門之遞迴分而治之思想的實現

網上有有趣的動態圖來表示快速排序,但其實我們大部分程式設計師都是腦子不太好使那種,即使看了形象生動的動態圖,還是想不到具體實現思路。

排序都有基本的步驟,快排也不例外,通常分為這麼幾步:

1、選擇基準值;

2、需要2個空陣列,分別位於基準值的左邊和右邊,小於基準值的push到左邊的陣列,大於基準值的push到右邊的陣列;

3、遞迴重複上面的步驟。

原始陣列

[2, 4, 1, 5, 3, 1]

找基準值 base

末尾元素1

拆分left [1] <- [base] -> [2, 4, 5, 3] right

遞迴對left和right的陣列重複第一步找新的基準值

模擬遞迴1

[1], [1], [2] <- [3] -> [4, 5]

模擬遞迴2

[1], [1], [2], [3], [4] <- [5] ->

遞迴結束,合併陣列

[...[1], ...[1], ...[2], ...[3], ...[4], ...[5]]

這個**模擬快速排序的具體步驟,遞迴是將一種規律重複執行n次的操作,我們找到快速排序的規律,然後return 遞迴,當遞迴到陣列為1個元素時,不再遞迴,因為只剩乙個元素的陣列不需要再比較了。

理論理解起來很容易,但經常是實際寫**,無從下手,下面是我根據快排的步驟實現的遞迴快速排序。qsort函式不複雜,他表示執行一次找基準值並且遍歷比較的過程,而你可能不太理解的是函式最後面的return。

return [...qsort(left), ...[base], ...qsort(right)]
將這個return拆分開來看。

1、返回值應該是個陣列 。

return
2、合併第一次快速排序的left,base,right陣列。接著就交給遞迴去執行左邊和右邊陣列的排序。

return [qsort(left), [base], qsort(right)]
3、因為qsort返回的是陣列,不是陣列元素,所以需要用es6語法...來雜湊開。

完整**:

function qsort(arr)  else 

} //遞迴並且合併陣列元素

return [...qsort(left), ...[base], ...qsort(right)]

}const arr = [2, 4, 1, 5, 3, 1]

const s = qsort(arr)

console.log(s) // [1, 1, 2, 3, 4, 5]

快速排序的平均時間複雜度是o(nlogn),最差情況是o(n²)。

java演算法系列

棧的概念 棧是一種特殊的線性表,堆疊的資料元素以及資料元素之間的關係和線性表是完全一樣的。差別是線性表是在任意位置進行插入和刪除操作,棧是只允許在固定的一端進行插入和刪除,棧的插入和刪除只允許在棧頂,棧的插入和刪除通常稱為進棧和出棧。資料集合 每個資料元素的資料型別可以是任意的型別 操作的集合 進棧...

演算法系列 Move Zeroes

given an array nums,write a function to move all 0 s to the end of it while maintaining the relative order of the non zero elements.for example,given ...

演算法系列 Missing Number

given an array containing n distinct numbers taken from 0,1,2,n,find the one that is missing from the array.for example,given nums 0,1,3 return 2.note...