歸併排序 快速排序 分治思想

2022-07-07 01:06:10 字數 1061 閱讀 8435

蒟蒻來水一篇博文方便複習參考

快速排序的基本原理:隨機選擇乙個基點,將比基點大的元素放在基點左側,將比基點小的元素放在基點右側。然後再分別只看基點左側和右側,重複上述過程。

由於其利用了分治思想,在平均狀態下其時間複雜度為o(nlogn).

基本**如下:

#includeusing namespace std;

void qsort(int a,int s,int m);//排序函式

int main()

qsort(a,0,n-1);

for(int i=0;i=m)

return;

while(i!=j)

swap(a[i],a[j]);

while(a[i]其時間複雜度同快速排序同為o(nlogn)。其主要思想為分治思想。

**如下:

#includevoid msort(int a,int s,int m,int b);//分函式

void merge(int a,int s,int mid,int m,int b);//歸併函式

using namespace std;

int main()

msort(a,0,n-1,b);

for(int i=0;i=m)

return;

int mid=s+(m-s)/2;

msort(a,s,mid,b);

msort(a,mid+1,m,b);

merge(a,s,mid,m,b);

}void merge(int a,int s,int mid,int m,int b)

while(i<=mid)

while(j<=m)

for (int k = 0; k < m - s + 1; ++k)

a[s + k] = b[k];//不能省略這一步(寫了兩次了都,都是省略了這一步出的錯誤),仔細品.

}

歸併排序(分治思想)

分治 劃分問題 把序列分成元素個數盡量相等的兩半 遞迴求解 把兩半元素分別排序 合併問題 把兩個有序表合併成乙個 include include include includeusing namespace std void merge sort int a,int x,int y,int t if...

歸併排序(分治思想)

演示 具體的我們以一組無序數列 14,12,15,13,11,16 為例分解說明,如下圖所示 上圖中首先把乙個未排序的序列從中間分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成乙個乙個的資料,再把這些資料兩兩歸併到一起,使之有序,不停的歸併,最後成為乙個排好序的序列。實現 include...

歸併排序(分治思想)

歸併排序 歸併排序 英語 merge sort,或mergesort 是建立在歸併操作上的一種有效的排序演算法。1945年由約翰 馮 諾伊曼首次提出。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,且各層分治遞迴可以同時進行。由於歸併排序分治出來是一棵二叉樹,複雜度...