演算法之「快速排序」

2021-08-30 13:42:10 字數 1520 閱讀 9466

快速排序,是一種速度快,效率高的排序演算法。

思路:在要排的陣列(比如陣列a)中選擇乙個中心值(如a[0]),通過一趟排序將陣列a劃分成兩部分,其中以key(一般是陣列的中心位置資料)為中心,假設要排的陣列按照從小到大排序,key右邊都比key大,key左邊都比key小,然後對這兩部分分別重複這個過程,直到整個有序。

整個快排的過程就簡化為了一趟排序的過程,然後呼叫遞迴就行了。

一趟排序的方法:

定義i=0,j=a.length-1,i為第乙個數的下標,j為最後乙個數下標

從陣列的最後乙個數aj從右往左找,找到第乙個小於key的數,計為ai

從陣列的第乙個數aj從左往右找,找到第乙個大於key的數,計為aj

交換aj和ai

重複這一過程,直到 i = j

調整key的位置,把a[i]和key交換

選擇 key=5 , 開始時 i=0, j=7

index   0 1 2 3 4 5 6 7 

開始:           5 2 8 9 2 3 4 9

第一次查詢:5 2 8 9 2 3 4 9

i           j

交換:           5 2 4 9 2 3 8 9

i           j

第二次查詢:5 2 4 9 23 89

i      j

交換:           5 2 4 3 29 89

i     j

第三次查詢:5 2 4 32

9 8 9ij

調整key:        2 2 4 35

9 8 9ij

**實現:

public class quicksort;

system.out.println(arrays.tostring(a));

quicksort(a);

system.out.println(arrays.tostring(a));

}public static void quicksort(int a)

}private static void quicksort(int a,int low,int high)

//2,存

int i=low;

int j=high;

//3,key

int key=a[low];

//4,完成一趟排序

while(i < j)

//從左往右找到第乙個大於key的數

while(i//執行完上面兩個迴圈,第乙個找到小於key的數a[j];第二個迴圈找到大於key的數a[i];交換兩個數的位置

if(i}

//調整key的位置

int tem=a[i];

a[i]=a[low];

a[low]=tem;

//對key的左邊的數快排

quicksort(a,low,i-1);

//對key的右邊的數快排

quicksort(a,i+1,high);

}}

演算法 排序演算法之快速排序

很受打擊啊啊啊啊啊!這道排序題我很久之前就做過,而且當時沒用20分鐘就搞定了,可是,今天在公司做完手上的活之後打算刷題時,又心血來潮的想重做一遍,心想反正也花不了多少時間,結果。血崩了。要求 對於乙個int陣列,請編寫乙個快速排序演算法,對陣列元素排序。給定乙個int陣列a及陣列的大小n,請返回排序...

演算法 排序演算法之快速排序

快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 nlogn 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 nlogn 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實現出來。快速排序...

排序演算法之快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...