日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(分治法)归并排序

發布時間:2025/3/12 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (分治法)归并排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
分治算法一般分為如下3個步驟。

劃分問題:把問題的實例劃分成子問題。
遞歸求解:遞歸解決子問題。
合并問題:合并子問題的解得到原問題的解。

歸并排序

按照分治三步法,對歸并排序算法介紹如下。
劃分問題:把序列分成元素個數盡量相等的兩半。
遞歸求解:把兩半元素分別排序。
合并問題:把兩個有序表合并成一個。

借鑒一下https://blog.csdn.net/yuehailin/article/details/68961304
的思想:

首先考慮下如何將將二個有序數列合并。這個非常簡單,只要從比較二個數列的第一個數,誰小就先取誰,取了后就在對應數列中刪除這個數。然后再進行比較,如果有數列為空,那直接將另一個數列的數據依次取出即可

解決了上面的合并有序數列問題,再來看歸并排序,其的基本思路就是將數組分成二組A,B,如果這二組組內的數據都是有序的,那么就可以很方便的將這二組數據進行排序。如何讓這二組組內數據有序了?

可以將A,B組各自再分成二組。依次類推,當分出來的小組只有一個數據時,可以認為這個小組組內已經達到了有序,然后再合并相鄰的二個小組就可以了。這樣通過先遞歸的分解數列,再合并數列就完成了歸并排序。

更簡潔的代碼:

#include<iostream> using namespace std; void merge_sort(int *a,int x,int y,int *t){if(y-x>1){int m=x+(y-x)/2;int p=x,q=m,i=x;merge_sort(a,x,m,t);merge_sort(a,m,y,t);while(p<m||q<y){if(q>=y||(p<m&&a[p]<=a[q]))t[i++]=a[p++];else t[i++]=a[q++];}for(int i=x;i<y;i++) a[i]=t[i];} } int main(){int a[100],b[100];for(int i=0;i<10;++i){cin>>a[i];}merge_sort(a,0,10,b);for(int i=0;i<10;++i){cout<<b[i]<<' ';} }

分析一下這個代碼的意思:
if(q>=y||(p < m && a[p] < =a[q]))
這個意思是說,如果右邊的數組為空或者左邊數組不為空,而且左邊的數小于右邊,那么就把左邊的這個數放到臨時空間
整體上來說,先遞歸成一個數,然后再進行合并

總結

以上是生活随笔為你收集整理的(分治法)归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。