分治演算法之快速排序

2021-06-08 07:58:23 字數 1209 閱讀 4523

快速排序演算法也是基於分治思想的一種排序演算法,它的基本操作即為比較-交換。

快速排序演算法的基本思想是從待排序的序列中選取乙個比較標準k(通常選取第乙個元素),然後將其餘元素依次跟k進行比較。在比較的過程中將大於k的元素移到k的後面,將小於k的元素移到k的前面,最後的結果是將原始序列分為兩個子串行,而k元素則恰好位於兩個子列中間。上述過程稱為一趟快速排序,接下來依次為兩個子串行進行快速排序,依次遞迴。當子串行的長度小於1時,遞迴停止。此時,原始序列已經成為乙個有序的序列了。

根據上面的思想,快速排序演算法的**實現如下所示。quicksort函式對原始序列遞迴進行快速排序,每次排序時先通過partiton函式得到序列中p到r元素間的分界點q,然後再分別對兩個子串行p到q-1和q+1到r進行快速排序。

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

}

partition函式是快速排序演算法的關鍵。該函式選取待排序序列的第乙個元素作為基準,通過反覆的比較-交換將p到r之間的元素分成兩組子串行,一組子串行的元素全部小於x,另一組子串行的元素全部大於x。

在具體的比較-交換過程中,設定兩個記錄點low和high,並在初始時將基準儲存到x中。然後不斷進行下面兩種掃瞄:

1.將high從右至左掃瞄,直到a[high] < x為止,由於此時的a[high]是第乙個小於基準x的元素,因此將a[high]和x交換。

2.將low從左至右掃瞄,直到a[low] >= x為止,由於此時的a[low]是第乙個不小於基準x的元素,因此將a[low]和x交換。

當low小於high時會一直持續上述兩種掃瞄,否則稱其完成了一次劃分過程。每一次的劃分過程就會得到分界位置,返回為quicksort函式。

int partition(int *a, int p, int r)

output_data(a, n);

while (low < high && a[low] < x)

low++;

if (low < high)

output_data(a, n);

}a[low] = x;

return low;

}

在partition函式中,選擇第乙個元素p作為基準可以保證該函式正常退出。如果選取最後乙個元素r作為基準,而該元素又恰好是最大元素,那麼partition函式就會返回r,這使得quicksort無限遞迴下去。

分治法之快速排序演算法

這週的演算法設計與分析的作業,要求是根據所講基本演算法選擇其一,給出具體事例,並且詳細描述演算法實現過程,同時利用一種語言程式設計實現,得出結果。將整個過程詳細整理上傳平台。上週所講演算法也只有那麼幾種 分治法,動態規劃 貪心演算法 回溯法 分值界限。這次用了分治法解決快速排序的問題。快速排序是c....

分治演算法 快速排序

一.演算法思想 假設要對某陣列進行由小 大排序 1 分解 對於亂序陣列a r 訪問範圍 0 r 有r 1個數 取乙個基準元素a p 一般以第乙個數即a 0 為基準 確定某個partition 位置 q 使a q 右邊的數都大於等於a p a q 左邊的數都小於等於a p 2 遞迴分治 分解之後,陣列...

快速排序 分治演算法

基於分治策略的排序在快速排序中,記錄的比較和交換是從兩端向中間進行的,關鍵字較大 小 的記錄一次就能交換到後 前 面單元,總的比較和移動次數較少。基本思想 對於輸入子陣列a p r 分解 以a p 為基準元素將a p r 劃分成三段a p q 1 a q 和a q 1 r 使得a p q 1 中任一...