演算法 快速排序演算法

2021-08-03 17:20:06 字數 2471 閱讀 9807

快速排序演算法是分治演算法技術的乙個例項,也稱為分割槽交換排序。快速排序採用遞迴呼叫對元素進行排序,是基於比較的排序演算法中的乙個著名演算法,也是面試常考的乙個演算法。

白話經典演算法系列之六 快速排序 快速搞定

假設快速排序的複雜度為t(n) 且所有元素都不相同。t(n) 取決於兩個子問題的規模,而規模又取決於中樞點。

書上說該演算法主要由以下四步組成:

如果陣列中僅有乙個元素或者沒有元素需要排序,則返回。

選擇陣列中的乙個元素作為中樞點(通常選擇陣列最左邊的元素)。

把陣列分成兩部分,一部分元素大於中樞點,一部分元素小於中樞點。

對兩部分陣列遞迴呼叫該演算法。

挖坑填數、分而治之。

假設有如下陣列,且擬定有乙個陣列 a[4,6,2,9,1,17] ,下標為index,和兩個指標 left 和 right,和乙個儲存中樞點的變數 temp。

初始時,取第乙個元素為中樞點,此時:left = 0; right = 5; temp = a[left] = 4;

由於已經將a[0]中的數儲存到temp中,可以理解成在陣列a[0]上挖了個坑,可以將其它資料填充到這來。

1、首先從右向左,尋找第乙個比temp小的數,準備填充到a[0]的位置上。

當right=4時滿足情況,於是將a[4] 挖走,填充到上乙個坑a[0]處,並且left++;此時:left=1;right=4;temp=4;形成新坑a[4]。

2、開始從左往右,尋找第乙個比temp大的數,準備填充到a[4]的位置上。當left=1時,便滿足條件,於是將a[1]挖走,填到上乙個坑a[4]處,並且right–;此時:left=1;right=3;temp=4;形成新坑a[1];

3、開始從右往左,尋找第二個比temp小的數,準備填充到a[1]的位置上。

當right=2時滿足情況,於是將a[2] 挖走,填充到上乙個坑a[1]處,並且left++;此時:left=2;right=2;temp=4;形成新坑a[2]。

4、此時left=right,則第一趟排序結束,將temp填充到中樞點index=2的位置上,可以看到,4的左邊都比4小,右邊都比4大。

5、得到新的中樞點後,遞迴對左邊和右邊重複上述過程即可完成整個排序。

1.i =l; j = r; 將基準數挖出形成第乙個坑a[i]。

2.j–由後向前找比它小的數,找到後挖出此數填前乙個坑a[i]中。

3.i++由前向後找比它大的數,找到後也挖出此數填到前乙個坑a[j]中。

4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。

public static void sort(int a,int l,int r)

if(left>right)

//選取中樞,通常選擇最左邊的元素

temp=a[left];

while(left < right)

if(left < right)

//再從左向右找不小於temp的元素來填上乙個坑

while(left < right && a[left] <= temp)

if(left < right)

} //走到這一步,必然left==right,得到中樞位置,將temp插入中樞位置

a[left]=temp;

//下標index

index=left;

//執行完一次排序操作,再對左邊和右邊分別遞迴

sort(a,l,index-1);

sort(a,index+1,r);

}

測試程式:

public static void  main(string arg);

long time=system.nanotime();

sort(a, 0, a.length-1);

system.out.println("耗時:"system.nanotime()-time);

for (int i : a)

}

列印內容如下:

耗時:965911

2458

925477

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

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

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

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...

演算法 快速排序演算法

快速排序的思想是 選取乙個樞軸值,一趟排序後,將待排序列分成兩部分,左邊部分均不大於這個樞軸值,右邊部分均不小於這個樞軸值。然後再次對兩側進行快速排序,直至整個序列有序。例項 include stdio.h define maxsize 10 int data maxsize void swap i...