快速排序演算法又稱為劃分交換排序,是對氣泡排序的一種改進,還是採用分治法
左右指標法
先設定乙個關鍵字key作為比較物件(一般取陣列的最前或最後的數),key=length-1
設定兩個變數left=0,right=length-1
left一直往後走,直到找到乙個大於key的值,left停下;此時right一直往前走直到找到乙個小於key的值,停下;此時兩數交換
重複操作,直到left和right同時指向乙個數的時候,將key於此數交換
此時,key左面的是比key小的,key右面的是比key大的,使用遞迴,呼叫自己,最後完成排序
//遞迴體
int i=left;
int j=right;
int index=a[left]
;while
(i!=j)
while
(a[i]
<=index&&i
if(i
(i==j)
quicksort
(a,left,i-1)
;quicksort
(a,i+
1,right)
;}需要注意的是,如果定義的key是最左邊的,那麼快速排序演算法必須從最右邊開始,即所謂的右哨兵先行
因為我們是從最左面的值作為key,根據正常的情況我們要把陣列分為兩塊,左面是小的,右面是大的,若左哨兵先行,那麼從左哨兵開始,比他小的數他都不會停留,比如:(5,4,2,3,6),這種情況,4,2,3這三個數,是不會互換位置的,那麼在進行分治也只是小規模的互換,其本質的還是沒有發生改變
由此,迴圈的開始必須是基準數的對面
挖坑法先選定基準值(本次選定a[right]為基準值),作為比較物件,並用index儲存此基準值
然後定義左右兩個指標,分別指向陣列左右兩端
從基準值對面的left開始遍歷,找到乙個比基準值大的數,並將他的值賦值給基準值所在的位置(此時,陣列中會有兩個相等的a[i],且i會在他做指定的位置不動)
然後right開始從他所在的位置開始向左遍歷,直到找到乙個比基準值小的數,並將他的值賦給剛才i所停留的位置(此時,陣列中會有兩個相等的a[j],且j會在他做指定的位置不動)
重複前兩步
直到i=j的時候,此時陣列中至少會有兩個值為a[i],此時把基準值index賦值給a[i]
這時,index左面的都是比index小的數,index右面的都是比index大的數,重複此遞迴方法…
public
static
void
quicksort
(int
a,int left,
int right)
int i=left;
int j=right;
int index=a[right]
;while
(ia[j]
=a[i]
;while
(i>=index)
a[i]
=a[j];}
if(i==j)
quicksort
(a,left,i-1)
;quicksort
(a,i+
1,right)
;}
快速排序常見的優化有:固定切分、隨機切分、三數取中
固定切分的效率不是太好
隨機切分雖然效率高,但是隨機性比較高
三數取中選擇基準點是最理想的
快速排序及其優化和快速選擇演算法
本文主要內容是快速排序的 編寫及其優化,還有快速選擇演算法 在無序的數中尋找第k大或小的元素 上 include include include include include include include include include include using namespace std d...
演算法導論 快速排序優化演算法!
常見快速排序 時間複雜度最好情況下o nlgn 最壞情況o n2 快速排序是基於分治模式的 分解 陣列a p.r 被劃分成兩個 可能空 子陣列a p.q 1 和a q 1.r 使得a p.q 1 中的每個元素都小於等於a q 而且,小於等於a q 1.r 中的元素。下 標q 也在返個劃分過程中迕行計...
基本排序演算法 快速排序演算法及其優化
快速排序 就是在乙個陣列中先選取乙個參考值v 基準 並將陣列分為小於基準和不小於基準的兩部分 快速排序的基本版 並遞迴將左右部分兩部分繼續分別快速排序,用到了分治的演算法思想,將乙個大問題分解成一系列有相同特點或性質的子問題,當子問題仍無法解決時繼續遞迴劃分,直到子問題可以被解決為止,這樣只要將子問...