快速排序是一種排序演算法,最壞情況執行時間為θ(n²),但其最佳期望執行時間為θ(nlgn),並且θ(nlgn)記號中隱含的常數因子很小,快排是在就地排序的一種排序演算法。快排是基於分治思想的,與歸併排序一樣。快速排序是一種不穩定的排序演算法,因為演算法實現過程中涉及到元素交換。
思路:(1)分解:陣列a[n]被劃分兩個字陣列a[0..q-1]和a[q+1..n],使得對於陣列a[0..q-1]中的元素都小於a[q], a[q+1..n]中的元素都大於等於a[q]。此時a[q]就得排好序。
(2)解決:通過遞迴呼叫快速排序,對字陣列a[0..q-1]和a[q+1..n]進行排序
(3)合併:因為兩個字陣列已經是就地排好序的了,整個陣列已經排好序了。
i=1;a[i]=a[1]=8;a[j]=a[3]=1;如下圖void quicksort(int a,int p,int r)
即i=0;a[i]與a[j]交換;;下面來實現輸入過程,length=8;main函式呼叫quicksort(a,0,length-1)即quicksort(a,0,7)。
此處舉例一次快排的執行過程:
基準選擇陣列的最後乙個元素a[r].
1.步驟7中for迴圈執行過程見下圖:j<=r-1;即j<=6;x=4
(1)j從0到6進行迴圈:i=-1;j=0
判斷if(a[j]<=x):a[j]=a[0]=2<4,執行
i++; middle=a[i]; a[i]=a[j]; a[j]=middle;
(2)j從1到6進行迴圈:i=0;j=1
判斷if(a[j]<=x):a[j]=a[1]=8>4;不滿足。執行下一次for迴圈
(3)j從2到6進行迴圈:i=0;j=2
判斷if(a[j]<=x):a[j]=a[2]=7>4;不滿足。執行下一次for迴圈
(4)j從3到6進行迴圈:i=0;j=3
判斷if(a[j]<=x):a[j]=a[3]=1<4;滿足,執行i++;a[i]與a[j]交換;
i++;
middle=a[i];
a[i]=a[j];
a[j]=middle;
(5)j從4到6進行迴圈:i=1;j=4
判斷if(a[j]<=x):a[j]=a[4]=3<4;滿足,執行i++;a[i]與a[j]交換;
i=2;a[i]=a[2]=7;a[j]=a[4]=3;如下圖:
(6)j從5到6進行迴圈:i=2;j=5
判斷if(a[j]<=x):a[j]=a[5]=5>4;不滿足。執行下一次for迴圈
(7))j從6到6進行迴圈:i=2;j=6
判斷if(a[j]<=x):a[j]=a[6]=6>4;不滿足。執行下一次for迴圈
(8)j++;j=7,跳出for迴圈。此時陣列如下圖:圖a
2.接下來執行步驟8,執行完後如圖b
返回i+1=3,即主元素的下標。
最後第一次遞迴執行的結果圖如下:
下次遞迴,主元素不再進行排序,分別對其左邊和右半邊的陣列進行排序。即2、1、3和7、5、6、8分別遞迴。此處不再一一舉例。
最後給出程式執行的結果:
演算法 排序 快速排序 QuickSort 分析
題目 演算法 排序 快速排序 quicksort 分析摘要 此文介紹了快速排序的演算法以及基本分析,最後總結。此系列文均為方便日後重複粗略檢視時不必翻看書籍。快速排序詳細分析 給出了非常詳細的partition時各種掃瞄方式,以及介紹分治時尾遞迴的方式。值得學習 簡要介紹 快速排序通過劃分陣列為分別...
排序演算法 之 快速排序(quicksort)
快速排序是排序演算法的一種,是不穩定的排序演算法。快速排序 使用快速排序法對一列數字進行排序的過程 分類排序演算法 資料結構 varies 最差時間複雜度 n2 最優時間複雜度 nlogn 平均時間複雜度 nlogn comparisons 最差空間複雜度 根據實現的方式不同而不同 最佳演算法 有時...
排序演算法之快速排序quickSort
快速排序是對氣泡排序的一種改進。它的基本思想是 通過一次排序將資料分割成兩部分,其中一部分的資料都比另外一部分的資料都要小,然後在對這兩部分進行相同操作 基本流程 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複...