快速排序爲什麼快

您是否想過快速排序爲什麼快?因爲它是目前最快的排序算法之一。但是,它仍然比冒泡,插入和選擇排序要快,並且在所有情況下都可以快速運行。在平均情況下,快速排序的複雜度爲Θ(n log(n)),最差的是Θ(n2)。當問題被分爲幾個小塊時,這些塊遞歸地分爲更多的塊和越來越多的塊。這可以看作是Θ(n log(n))複雜度。

快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。

快速排序使用分治法來把一個串(list)分爲兩個子串(sub-lists)。具體算法描述如下:

[1, 3, 2]
[1], [3, 2]
[1, 2], [3]
[1,2,3]

1、從數列中挑出一個元素,稱爲 "基準"(pivot); 

2、重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱爲分區(partition)操作;

3、遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

function quickSort(arr) {
if(arr.length < 2) return arr
const pivot = arr.shift()
const leftOfPivot = []
const rightOfPivot = []
for(let i =  0; i < arr.length; i++) {
if(arr[i] <= pivot)
      leftOfPivot.push(arr[i])
else
      rightOfPivot.push(arr[i])
  }
return [...quickSort(leftOfPivot), pivot, ...quickSort(rightOfPivot)]
}

我們利用遞歸函數和解構。每當您編寫遞歸函數時,始終首先定義一個遞歸的終止條件,在我們的案例中,如果數組少於兩個元素,則意味着數組只有一個元素並且不需要排序,我們只返回arr。如果數組大小大於2,我們首先使用shift()選取數據,這會從原始數組中刪除第一個元素並返回它。

然後,我們需要兩個數組來存儲根據基準點排序的元素。

然後,我們迭代原始數組。則將原始數組中小於pivot的項目將其推到leftOfPivot []。否則在 rightOfPivot [] 數組中。

關鍵部分到了。我們使用...進行解構,並使用leftOfPivot []rightOfPivot []數組調用quickSort()以重複所有此過程。所有這些單獨的遞歸將一直運行,直到它們的數組大小小於2。每個遞歸最終將產生其自己的排序數組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章