分治法之快速排序演算法

2021-07-08 21:00:46 字數 1547 閱讀 6952

這週的演算法設計與分析的作業,要求是根據所講基本演算法選擇其一,給出具體事例,並且詳細描述演算法實現過程,同時利用一種語言程式設計實現,得出結果。將整個過程詳細整理上傳平台。

上週所講演算法也只有那麼幾種:分治法,動態規劃、貪心演算法、回溯法、分值界限。

這次用了分治法解決快速排序的問題。

快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,它的具體思想如下:

1.從數列中挑出乙個元素,稱為 「基準」(pivot);

2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

3.遞迴(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

本次試驗的目的是隨機生成9個正整數,然後使用快速排序演算法對這9個正整數從小到大進行排序,並輸出排序結果。程式如附錄一所示,執行結果如附錄二所示。

具體的步驟如下:

1. 假設隨機數為83,82,86,84,23,43,61,83,53,並列印出來。

2. 設最左邊的數a[left]=a[0],最右邊的數a[right]=a[8],若left小於right,則進行下面的分割槽。

3. 設a[right]為基準值,從左邊第乙個數開始與基準數進行比較,若a[i]比基準值小,則與a[j]交換位置,最終排列情況為,以基準值為中心,基準值左邊的值小於基準值,基準值右邊的值大於基準值。例如;第一次分割槽結果為:23,43,53,83,82,86,84,61,83。

4. 以基準數為界限,左邊的區從a[0]到基準數前乙個數,右邊的區從基準數後乙個到a[8],重新進行步驟3.

5. 一直重複步驟4,直到數列按照從小到大排列。

6. 列印出來最終結果。

附錄一:

#include#include

#include

#define random(i) (rand()%i)

#define n 9 //設定陣列長度

//分割槽操作

int partition(int array, int left, int right)

} return j;

}//迭代運算

void quiksort(int array, int left, int right)

}//示例

int main()

printf("\n\n");

quiksort(a, 0, n-1);

for (i=0; i//排序後

排序演算法 快速排序(分治法)

思想 快速排序採用的思想是分治思想。快速排序是找出乙個元素 理論上可以隨便找乙個 作為基準 pivot 然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n 1個元素也調整到排序後的正確位置。最...

分治法之快速排序演算法解題思路

快速排序演算法的基本思想是 先找乙個基準元素 比如待排序陣列的第乙個元素 進行一趟快速排序,使得該基準元素左邊的所有資料都它小,而右邊的所有資料都它大,然後再按此方法,對左右兩邊的資料分別進行快速排序,整個排序過程可以 遞迴進行,以此達到整個陣列變成有序序列。比如我們現在對序列arr 這6個數進行排...

分治演算法之快速排序

快速排序演算法也是基於分治思想的一種排序演算法,它的基本操作即為比較 交換。快速排序演算法的基本思想是從待排序的序列中選取乙個比較標準k 通常選取第乙個元素 然後將其餘元素依次跟k進行比較。在比較的過程中將大於k的元素移到k的後面,將小於k的元素移到k的前面,最後的結果是將原始序列分為兩個子串行,而...