演算法分析之 quick sort快速排序

2021-07-11 02:11:43 字數 2349 閱讀 2674

快速排序是一種排序演算法,最壞情況執行時間為θ(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)合併:因為兩個字陣列已經是就地排好序的了,整個陣列已經排好序了。

void quicksort(int a,int p,int r)

;下面來實現輸入過程,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;

即i=0;a[i]與a[j]交換;

(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;

i=1;a[i]=a[1]=8;a[j]=a[3]=1;如下圖

(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 再對左右區間重複...