簡述資料結構與演算法之快速排序

2021-07-27 21:33:36 字數 1440 閱讀 8710

#include using namespace std;

//快速排序

void quick_sort(int s, int l, int r)//l是第一位置,r是最後乙個位置

s[i] = x;

quick_sort(s, l, i - 1); // 遞迴呼叫

quick_sort(s, i + 1, r); }}

void main()

quick_sort(p, 0, count - 1);

for (int i = 0; i < count; i++)

system("pause");

}

是利用是分治法,把問題化小。挖坑法

1.先從數列中取出乙個數作為基準數。

2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重複第二步,直到各區間只有乙個數。

雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步驟。因此我的對快速排序作了進一步的說明:挖坑填數+分治法:

先來看例項吧,定義下面再給出(最好能用自己的話來總結定義,這樣對實現**會有幫助)。

以乙個陣列作為示例,取區間第乙個數為基準數。

0  1  2  3  4  5  6  7  8  9

72 6 57 88 60 42 83 73 48 85

初始時,i = 0;  j = 9;   x = a[i] = 72

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

從j開始向前找乙個比x小或等於x的數。當j=8,符合條件,將a[8]挖出再填到上乙個坑a[0]中。a[0]=a[8]; i++;  這樣乙個坑a[0]就被搞定了,但又形成了乙個新坑a[8],這怎麼辦了?簡單,再找數字來填a[8]這個坑。這次從i開始向後找乙個大於x的數,當i=3,符合條件,將a[3]挖出再填到上乙個坑中a[8]=a[3]; j--;

陣列變為:

0  1  2  3  4  5  6  7  8  9

48 6  57 88 60 42 83 73 88 85

i = 3;   j = 7;   x=72

再重複上面的步驟,先從後向前找,再從前向後找。

從j開始向前找,當j=5,符合條件,將a[5]挖出填到上乙個坑中,a[3] = a[5]; i++;

從i開始向後找,當i=5時,由於i==j退出。

此時,i = j = 5,而a[5]剛好又是上次挖的坑,因此將x填入a[5]。

陣列變為:

0  1  2  3  4  5  6  7  8  9

48 6 57 42 60 72 83 73 88 85

可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。因此再對a[0…4]和a[6…9]這二個子區間重複上述步驟就可以了。

資料結構與演算法之快速排序

1.快速排序的 實現如下 include using namespace std template void sort t data,size t head,size t tail templatesize t partition t data,size t head,size t tail tem...

資料結構與演算法之快速排序

快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod 該方法的基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 ...

資料結構與演算法 排序演算法之六 快速排序

一 快速排序 排序演算法中的奧斯卡,諾貝爾獎,當屬快速排序!快速排序是20世紀十大演算法之一!1 基本思想 前面提到氣泡排序,它是一種交換排序,堪稱最慢的排序演算法。可是,物極必反,快速排序是氣泡排序的公升級加強版,同屬於交換排序類。以 空間 換時間,快速排序不是相鄰元素的交換,而是加大了比較和交換...