快速排序演算法 挖坑法 左右指標法 快慢指標法)

2021-08-27 21:16:18 字數 1963 閱讀 4027

挖坑法,可以理解成拆東牆補西牆。這裡以陣列[4,1,7,6,9,2,8,0,3,5]為例子講解。以資料第乙個元素作為樞軸(也可以是最後乙個,看你喜好)。

這裡我們先把作為樞軸的4摳出來單獨放置,此時陣列變成了

[口,1,7,6,9,2,8,0,3,5]

這時我們要從陣列尾部開始往前找,找第乙個比4小的數字,5比4大,j - -,這時3比4小,把3放在坑里。因為把3摳出來補坑里了,因此3原來所在的位置又變成了乙個坑。

[3,1,7,6,9,2,8,0,口,5]

這時候我們要從陣列頭部開始往後找,找第乙個比4大的數字,1比4小,i + +,這時7比4大,把7放在坑里。這時,7原來的位置又變成了坑。

[3,1,口,6,9,2,8,0,7,5]

接著從陣列右邊開始找比4小的數,0比4小,把0摳出來放在坑里。0原來的位置又變成了坑。

[3,1,0,6,9,2,8,口,7,5]

接著從陣列左邊開始找比4大的數字,6比4大,把6摳出來放在坑里。6原來的位置又變成了乙個坑。

[3,1,0,口,9,2,8,6,7,5]

接著從右邊開始找比4小的數字,8不比4小,j - -,這時2比4小,把2摳出來放在坑里。2原來的位置變成了坑。

[3,1,0,2,9,口,8,6,7,5]

接著從陣列左邊找比4大的數字,9比4大,把9放進坑里。9原來的位置變成了坑。

[3,1,0,2,口,9,8,6,7,5]

此時i==j,即游標重疊了。這時,我們將一開始取出來的樞軸4放進最後這個坑里。這就完成了第一趟快排。

[3,1,0,2,4,9,8,6,7,5]

你會發現樞軸4左邊的數字都比4小,4右邊的數字都比4大。

接下來[3,1,0,2]和[9,8,6,7,5]分別都採用這樣的挖坑法進行排序。一直到陣列只包含乙個數字為止,便完成了最終的排序。

public class test else 

} swap(arr,more,r);//當遍歷結束之後(指標相遇),將樞軸x與大於x的第一位上的數(陣列下標為more的數)進行交換

return new int ;//less+1和more為陣列中等於x的數在排序後的下標的左右臨界位置

} public static void swap(int arr,int i,int j)

public static void main(string args) ;

quicksort(arr,0,arr.length-1);

for(int i:arr)

}}

輸出:1 3 3 3 4 5 6 8

思路:隨機選擇陣列中的乙個數x和陣列最後乙個數進行交換,然後用隨機選擇的數x來作為樞軸進行劃分。這樣的話,就不能說會輕易的找到最差的情況了,因為每一次排序選擇的樞軸都是隨機的,可能選擇到最好情況的樞軸(中位數),也有可能選擇到最差情況的樞軸(邊界值),這樣的話,它的複雜度就是乙個概率事件了。所以在估計的時候就不能說它有乙個最差情況了,只能用長期期望的方式來算出它的時間複雜度。這裡有計算公式證明長期期望的時間複雜度是o(nlogn)。空間複雜度為o(logn)。空間複雜度浪費在了劃分點p的位置上,每一次排序都要記下劃分點位置,方便找到遞迴子過程的邊界位置。

public class testelse 

} swap(arr,more,r);//當遍歷結束之後(指標相遇),將樞軸x與大於x的第一位上的數(陣列下標為more的數)進行交換

return new int ;//less+1和more為陣列中等於x的數在排序後的下標的左右臨界位置

} public static void swap(int arr,int i,int j)

public static void main(string args) ;

quicksort(arr,0,arr.length-1);

for(int i:arr)

}}

輸出:1 3 3 3 4 5 6 8

快速排序 挖坑填補法

看了這片文章,確實非常形象,quicksort 找乙個標準值 樞軸 將比標準值小的放到左側,比標準值大的放在它右側,根據標準值位置將當前資料分割成兩部分,兩部分分別重複以上以上操作 includeint sort int arr,int nlow,int nhigh nhigh 從前向後找比標準值大...

挖坑法之 快速排序

速度快,耗時小,面對資料量大的題目時可用快排 選取基準數,不斷 挖坑 填坑 使小於基準數的數全在其左邊,大於其的數全在右邊 最後陣列有序 參考鏈結 選擇最左端的數為基準數x 可將其視為乙個坑,可以將別的數填入這個坑 從右往左尋找小於x的數y,找到後填入坑,此時原基準數的坑被填,而y處產生新的乙個坑,...

快速排序 前後指標法)

之前的兩篇中,為大家介紹了霍爾劃分和挖坑法劃分,這一篇,我們來看看第三種劃分方法 前後指標法。顧名思義,需要兩個指標,乙個在前乙個在後,分別用cur表示前指標,prev表示後指標 這裡的指標的意思是待排序數列的下標 依舊是這個圖,初始時,我們規定cur在prev的後乙個位置,這裡我們還是選擇第乙個數...