快速排序由於排序效率在同為
o(n*logn)
的幾種排序方法中效率較高,因此經常被採用,再加上快速排序思想
----
it公司都喜歡考這個,還有大大小的程式方面的考試如軟考,考研中也常常出現快速排序的身影。
總的說來,要直接默寫出快速排序還是有一定難度的,因為本人就自己的理解對快速排序作了下白話解釋,希望對大家理解有幫助,達到快速排序,快速搞定。
快速排序是
c.r.a.hoare
於1962
年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法
(divide-and-conquermethod)
。該方法的基本思想是:
1.先從數列中取出乙個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有乙個數。
雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步驟。因此我的對快速排序作了進一步的說明:
挖坑填數
+分治法:
先來看例項吧,定義下面再給出(最好能用自己的話來總結定義,這樣對實現**會有幫助)。
以乙個陣列作為示例,取區間第乙個數為基準數。01
2345
6789
7265788
6042
8373
4885
初始時,
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--;
陣列變為:01
2345
6789
4865788
6042
8373
8885
i = 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]
。陣列變為:01
2345
6789
4865742
6072
8373
8885
可以看出
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]
中。照著這個總結很容易實現挖坑填數的**:
int adjustarray(int
s, int
l, int r)
//返**整後基準數的位置
// 從左向右找大於或等於
x的數來填
s[j]
while(
i<
j&& s[
i] < x)
i++;
if(i
< j)
}//退出時,i等於
j。將x填到這個坑中。s[
i] = x;
return i;
}再寫分治法的**:
void quick_sort1(int
s, int
l, int r)
}這樣的**顯然不夠簡潔,對其組合整理下:
//快速排序
void quick_sort(int
s, int
l, int r)
s[i] = x;
quick_sort(s,
l, i- 1);
// 遞迴呼叫
quick_sort(s,
i+ 1, r);
}}快速排序還有很多改進版本,如隨機選擇基準數,區間內資料較少時直接用另的方法排序以減小遞迴深度。有興趣的筒子可以再深入的研究下。注1
,有的書上是以中間的數作為基準數的,要實現這個方便非常方便,直接將中間的數和第乙個數進行交換就可以了。
填坑法 快速搞定快速排序演算法
該方法的基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。以乙個陣列作為示例,取區間第乙個數為基準數。我先上個圖讓大家感受一下,畫了很長時間,但是畫的還是很差,將就下看看吧...
白話經典演算法系列之 快速排序 快速搞定
總的說來,要直接默寫出快速排序還是有一定難度的,因為本人就自己的理解對快速排序作了下白話解釋,希望對大家理解有幫助,達到快速排序,快速搞定。快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod ...
5分鐘搞定快速排序
直接切入主題,快速排序分為兩過程 挖抗填數 分治法 先說下分治法,顧名思義就是 分而治之 的核心思想。簡單舉個例子體會一下 現在有100個人需要按照身高排成一列。首先,定個身高基準1.7m 定得太高和太低都會打破平衡 高與1.7m的都站在一列的右端,低於1.7m的都站在一列的左端。1.7m即為左右端...