簡述
快速排序可以說算是針對氣泡排序的一種優化,氣泡排序是順序交換,這樣交換次數順序增長。如果我們做跳躍的交換,那麼可以使得交換次數也是跳躍性,會有所降低
演算法思想
找出乙個樞軸,用於做比較交換,並記下後用。一般用第乙個(用第
一、中間、最後三個取中後來效果會更好),定乙個高位:high和底位:low
從表的高位開始,往左進行比較,找到乙個關鍵字小於樞軸,則將high和樞軸交換。否則high–
從表的低位開始,往右進行比較,找到乙個關鍵字大於等於樞軸,則將low和樞軸交換。否則low++
重複2和3步,直到low==high位置,此時low和high的位置則是樞軸在本趟排序在表的最終位置,成功將表分成比樞軸小和比樞軸大兩個字表在樞軸左右兩側。
以上2和3步驟,每次交換,要做三次記錄:
一次移動low到high,一次移動high到low,加中間借助了temp這一類的。
我們可以減少移動記錄:
比如一開始記錄下樞軸值,在每次移動的時候,只移動要與樞軸交換的記錄,移動完成後,最後將開始記錄下的樞軸關鍵字放入最終的樞軸位置。
演算法實現
private
static
class
quicksortclass ;
for (int value : intarray)
esort(integers, 0, intarray.length - 1);
system.out.print(integers);
}/**
* 計算樞軸位置,通過進行一輪交換得到新的樞軸位置
**@param ints
*@return 返回交換後的樞軸的位置
*/private
intevaluateprivotpartition(listints, int l, int h) else
if (centervalue > math.min(onevalue, lastvalue) && onevalue < math.max(onevalue, lastvalue)) else
system.out.println("樞軸記錄:privotdef=" + privotdef);
/*重複第二三步,直到low==high為止*/
while (low < high)
//小於樞軸值時候,需要和做交換,將high移到low
if (low < high)
//第三步:從low往右,如果low位置的值小於等於樞軸記錄,那麼low++
while (low < high
&& ints.get(low) <= privotdef)
//找到比樞軸記錄大的值,那麼low換到high
if (low < high)
}//將記錄下來的樞軸放入low位置,樞軸記錄到位
ints.set(low, privotdef);
for (integer value : ints)
system.out.print("\n");
return low;
}/**
* 執行快速排序入口
**@param ints
*@param low
*@param high
*/private
void
esort(listints, int low, int high) }}
public
static
void
main(string args)
可以看到,在evaluateprivotpartition中有乙個,取中間值的步驟,不加那一步也是可以,跑一下你就會發現,本次排序用了6趟。如果不加那一步,則預設使用第乙個為樞軸記錄,最後排序下來的趟數會是7趟。
不要小看只多了一趟,如果數更大,優勢會更明顯。
演算法分析
可以看下排序的遞迴樹:
大致也能看出,排序的躺數取決於遞迴樹的深度.
t(n)=cn+2t(n/2)
t(n) <=n+2t(n/2)
繼續往下得到t(n)約等於o(nlog2n)
最壞的情況:帶排序序列已經排好的情況下,其遞迴數為單只樹,每次劃分得到乙個比上乙個少的序列,這樣必須經過n-1趟才能將所有記錄定位,而且第i趟需要經過n-i次比較,比較次數就為n2/2
為了避免最壞情況,所以我們可以使用三者取中原則進行選取樞軸記錄,就是前面**用到的方式
排序是遞迴的,所以需要有乙個棧來存放相應的資料。最大遞迴呼叫次數與遞迴樹的深度一致。為o(log2n),最壞情況下為o(n)
演算法特點
不穩定:記錄非順序次地移動導致
難用於鏈式結構:需要定位表的下界和上界,適合順序結構
平均來說,快排可以說是內部排序中最快的一種了,在初始無序,n比較大的情況,使用快排是比較合適的。
了解快速排序,了解它跳躍的思想,對平時程式設計也是有幫助的,本文章是借助一本老的教科書學習所得,記錄。
交換排序 快速排序
快速排序 quick sort 也是一種交換排序,它在排序中採取了分治策略。從待排序列中選取一元素作為軸值 也叫主元 將序列中的剩餘元素以該軸值為基準,分為左右兩部分。左部分元素不大於軸值,右部分元素不小於軸值。軸值最終位於兩部分的分割處。對左右兩部分重複進行這樣的分割,直至無可分割。從快速排序的演...
交換排序之快速排序
1.基本思想 假設要排序的陣列是array 0 array n 1 首先任意選取乙個資料 通常選用第乙個資料 作為關鍵資料,然後將所有比它的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。一趟快速排序的演算法是 1 設定兩個變數i j,排序開始的時候i 0,j n 1 2 以第...
交換排序 2 快速排序
快速排序 快速排序的基本演算法思想是 設待排序的元素序列個數為 n,存放在陣列 a中,令第乙個元素為樞軸元素,即將 a 0 作為參考元素,令 pivot a 0 初始時,令 i 0 j a.legth 1 然後按以下方法操作 1 從序列的 j位置往前,依次將陣列的中的元素與樞軸元素相比較,如果當前元...