交換排序 快速排序

2021-08-18 14:46:36 字數 2501 閱讀 8514

簡述

快速排序可以說算是針對氣泡排序的一種優化,氣泡排序是順序交換,這樣交換次數順序增長。如果我們做跳躍的交換,那麼可以使得交換次數也是跳躍性,會有所降低

演算法思想

找出乙個樞軸,用於做比較交換,並記下後用。一般用第乙個(用第

一、中間、最後三個取中後來效果會更好),定乙個高位: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位置往前,依次將陣列的中的元素與樞軸元素相比較,如果當前元...