实现快速排序的算法_排序算法-快速排序
快速排序是由東尼霍爾所發展的一種排序算法。在平均n個項目要Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況并不常見。事實上,快速排序通常明顯比其他 Ο(nlogn) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。
快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)。
快速排序又是一種分而治之思想在排序算法上的典型應用。本質上來看,快速排序應該算是在冒泡排序基礎上的遞歸分治法。
算法步驟:
具體實現有兩種方法:
挖坑法
給定一組原始數列,要求從小到大排序:
首先,我們選定基準元素Pivot,并記住這個位置index,這個位置相當于一個“坑”。并且設置兩個指針left和right,指向數列的最左和最右兩個元素:
接下來,從right指針開始,把指針所指向的元素和基準元素做比較。如果比pivot大,則right指針向左移動;如果比pivot小,則把right所指向的元素填入坑中。
在當前數列中,1<4,所以把1填入基準元素所在位置,也就是坑的位置。這時候,元素1本來所在的位置成為了新的坑。同時,left向右移動一位。
此時,left左邊綠色的區域代表著小于基準元素的區域。
接下來,我們切換到left指針進行比較。如果left指向的元素小于pivot,則left指針向右移動;如果元素大于pivot,則把left指向的元素填入坑中。
在當前數列中,7>4,所以把7填入index的位置。這時候元素7本來的位置成為了新的坑。同時,right向左移動一位。
此時,right右邊橙色的區域代表著大于基準元素的區域。
下面按照剛才的思路繼續排序:
8>4,元素位置不變,right左移
2<4,用2來填坑,left右移,切換到left。
6>4,用6來填坑,right左移,切換到right。
3<4,用3來填坑,left右移,切換到left。
5>4,用5來填坑,right右移。這時候left和right重合在了同一位置。
這時候,把之前的pivot元素,也就是4放到index的位置。此時數列左邊的元素都小于4,數列右邊的元素都大于4,這一輪交換終告結束。
指針交換法:
給定原始數列如下,要求從小到大排序:
開局和挖坑法相似,我們首先選定基準元素Pivot,并且設置兩個指針left和right,指向數列的最左和最右兩個元素:
接下來是第一次循環,從right指針開始,把指針所指向的元素和基準元素做比較。如果大于等于pivot,則指針向左移動;如果小于pivot,則right指針停止移動,切換到left指針。
在當前數列中,1<4,所以right直接停止移動,換到left指針,進行下一步行動。
輪到left指針行動,把指針所指向的元素和基準元素做比較。如果小于等于pivot,則指針向右移動;如果大于pivot,則left指針停止移動。
由于left一開始指向的是基準元素,判斷肯定相等,所以left右移一位。
由于7 > 4,left指針在元素7的位置停下。這時候,我們讓left和right指向的元素進行交換。
接下來,我們進入第二次循環,重新切換到right向左移動。right先移動到8,8>2,繼續左移。由于2<8,停止在2的位置。
切換到left,6>4,停止在6的位置。
元素6和2交換。
進入第三次循環,right移動到元素3停止,left移動到元素5停止。
元素5和3交換。
進入第四次循環,right移動到元素3停止,這時候請注意,left和right指針已經重合在了一起。
當left和right指針重合之時,我們讓pivot元素和left與right重合點的元素進行交換。此時數列左邊的元素都小于4,數列右邊的元素都大于4,這一輪交換終告結束。
代碼實現:
總結
以上是生活随笔為你收集整理的实现快速排序的算法_排序算法-快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux npm安装_怎样在Linux
- 下一篇: 向量距离计算 java_Milvus 向