本文參考了:
總的說來,要直接默寫出快速排序還是有一定難度的,因為本人就自己的理解對快速排序作了下白話解釋,希望對大家理解有幫助,達到
快速排序,快速搞定。
快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。
該方法的基本思想是:
1.先從數列中取出乙個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有乙個數。
雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步驟。因此我的對快速排序作了進一步的說明:挖坑填數+分治法:
先來看例項吧,定義下面再給出(最好能用自己的話來總結定義,這樣對實現**會有幫助)。
以乙個陣列作為示例,取區間第乙個數為基準數。0
1 2
3 4
5 6
7 8
9 72
6 57
88 60
42 83
73 48
85 初始時,i = 0; j = 9; x = a[i] = 72
由於已經將a[0]中的數儲存到x中,可以理解成在陣列a[0]上挖了個坑,可以將其它資料填充到這來。
從j開始向前找乙個比x小或等於x的數。當j=8,符合條件,將a[8]挖出再填到上乙個坑a[0]中。a[0]=a[8]; i++; 這樣乙個坑a[0]就被搞定了,但又形成了乙個新坑a[8],這怎麼辦了?簡單,再找數字來填a[8]這個坑。這次從i開始向後找乙個大於x的數,當i=3,符合條件,將a[3]挖出再填到上乙個坑中a[8]=a[3]; j--;
陣列變為: 0
1 23 4
5 67 8
9 48
6 57
88 60
42 83
73 88
85i = 3; j = 7; x=72
再重複上面的步驟,先從後向前找,再從前向後找。
從j開始向前找,當j=5,符合條件,將a[5]挖出填到上乙個坑中,a[3] = a[5]; i++;
從i開始向後找,當i=5時,由於i==j退出。
此時,i = j = 5,而a[5]剛好又是上次挖的坑,因此將x填入a[5]。
陣列變為: 0
1 23 4
5 67 8
9 48
6 57
42 60
72 83
73 88
85可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它
。因此再對a[0…4]和a[6…9]這二個子區間
重複上述步驟就可以了。
對挖坑填數進行總結
1.i =l; j = r; 將基準數挖出形成第乙個坑a[i]。
2.j--由後向前找比它小的數,找到後挖出此數填前乙個坑a[i]中。
3.i++由前向後找比它大的數,找到後也挖出此數填到前乙個坑a[j]中。
4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。
照著這個總結很容易實現挖坑填數的**:
static void quicksort(int a, int left, int right)
if (left < right)
if (i < j)
while (i < j && a[i] < pivot)
if (i < j)
}a[i] = pivot;
/*** 遞迴
*/quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
} }
快速排序還有很多改進版本,如隨機選擇基準數,區間內資料較少時直接用另的方法排序以減小遞迴深度。
以下是參考《資料結構與演算法分析》書上的分制和去樞紐數的實現:
static void quicksort1(int a, int left, int right)
if (left < right)
while (i < j && a[j] >= pivot)
if (i < j)
}//pivot與a[i]交換值
temp = a[i];
a[i] = a[right - 1];
a[right - 1] = temp;
/*** 遞迴
*/quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
} }/**
* 三數取中值
* @param a
* @param left
* @param right
* @return
*/private static int median3(int a, int left, int right)
if (a[right] < a[left])
if (a[right] < a[center])
//place pivot at position right - 1 or left + 1,這樣left和right就不用移動
temp = a[center];
a[center] = a[right - 1];
a[right - 1] = temp;
return a[right - 1];
}
演算法實現Java之快速排序
package com.gpf.arithmetic public class quicksort system.out.println 排序前 for int i array quicksort array,0 array.length 1 system.out.println n排序後 for ...
Java演算法之 快速排序的實現
剛剛找到工作,但是發現自己雖然對資料結構的知識了解原理,但是實現的話,仍然有很大的麻煩。決定在大學的最後幾個月對資料結構進行乙個系統的詳細的學習。好了,第一篇 快速排序的演算法。由於我只是想實現乙個簡單的原理,所以類的構造就比較簡單了,比較的原型都死int型的。快速的排序的定義我不說了,直接貼源 p...
排序演算法 快速排序 java實現
它採用了一種分治的策略,通常稱為分治法。分治法思想 將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。對於陣列a,隨機選擇乙個元素作為基準數pos,一般為第乙個元素或最後乙個元素。將該陣列分為兩堆a 0,pos index 1 和 a ...