快速排序演算法的基本思想是:先找乙個基準元素(比如待排序陣列的第乙個元素),進行一趟快速排序,使得該基準元素左邊的所有資料都它小,而右邊的所有資料都它大,然後再按此方法,對左右兩邊的資料分別進行快速排序,整個排序過程可以
遞迴進行,以此達到整個陣列變成有序序列。
比如我們現在對序列arr=這6個數進行排序: 0
1234
5-2688
0-4560
1234
56-26
880-456ij
無論是對於變數i還是j,我們都是先移動再判斷是否繼續移動。首先++i,即向右移動i,直到它已經移到待排序序列最右邊即i=5處,或者arr[i] >= key時,停止移動。比如這裡i在向右移動,然後它發現移到下標1的時候,對應元素的值為6,大於-2,故i停止移動: 0
1234
56-26
880-456ij
接下來移動j了:它會向左移,直到它找到乙個數,使得arr[i]<=key,這裡j發現移到下標4的時候,對應元素為-4,小於key,故停止移動: 0
1234
56-26
880-456ij
此時判斷一下i和j有沒有碰頭,如果i>=j,終止迴圈,否則,交換arr[i]和arr[j],然後繼續跟上面一樣移動 i j 直到它們碰頭:01
2345
6-2-48806
56ij這一次i和j碰頭(i>=j)了,所以迴圈終止:01
2345
6-2-48806
56ji交換arr[p]與arr[j]位置的元素,arr[p]就是當前序列的首個元素-2,交換結果如下: 0
1234
56-4-2880
656ji
至此第一趟快速排序結束了,我們可以發現,到目前為止,基準元素-2現在在下標 j=1 那裡,而它左邊的每乙個元素都比它小,而右邊的每乙個元素都比它大,當然,被分隔出來的這兩個序列目前還是無序的,所以我們接下來的任務就是分別對這兩個序列進行快速排序,如此遞迴下去,直到整個陣列成為乙個有序序列:
由於左邊序列只有乙個元素了,那就不用排序了,所以輪到右邊序列排序:
當前待排序序列為了,同樣選基準元素key=88,i指向88對應的位置,j指向當前序列最後乙個元素的下乙個位置6: 0
1234
56-4-2880
656ij
然後又是跟之前一樣的方式將這個序列排成: 0
1234
56-4-2880
656i j012
3456
-4-2560
688i j然後,我們又完成了一趟快速排序,接下來的任務,就是對基準元素88左右兩個序列繼續排對吧?,也就是對繼續排,因為88右邊沒有元素了,所以它右邊就不需要遞迴了......
排序全過程加最終結果:
原始序列:
分治法之快速排序演算法
這週的演算法設計與分析的作業,要求是根據所講基本演算法選擇其一,給出具體事例,並且詳細描述演算法實現過程,同時利用一種語言程式設計實現,得出結果。將整個過程詳細整理上傳平台。上週所講演算法也只有那麼幾種 分治法,動態規劃 貪心演算法 回溯法 分值界限。這次用了分治法解決快速排序的問題。快速排序是c....
排序演算法 快速排序(分治法)
思想 快速排序採用的思想是分治思想。快速排序是找出乙個元素 理論上可以隨便找乙個 作為基準 pivot 然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n 1個元素也調整到排序後的正確位置。最...
分治演算法之快速排序
快速排序演算法也是基於分治思想的一種排序演算法,它的基本操作即為比較 交換。快速排序演算法的基本思想是從待排序的序列中選取乙個比較標準k 通常選取第乙個元素 然後將其餘元素依次跟k進行比較。在比較的過程中將大於k的元素移到k的後面,將小於k的元素移到k的前面,最後的結果是將原始序列分為兩個子串行,而...