网页免费制作网站,搜狗站长平台验证不了,如何自建网站服务器,网站建设落地页分治算法一般分为如下3个步骤。
划分问题#xff1a;把问题的实例划分成子问题。 递归求解#xff1a;递归解决子问题。 合并问题#xff1a;合并子问题的解得到原问题的解。
归并排序
按照分治三步法#xff0c;对归并排序算法介绍如下。 划分问题#xff1a;把序列…分治算法一般分为如下3个步骤。
划分问题把问题的实例划分成子问题。 递归求解递归解决子问题。 合并问题合并子问题的解得到原问题的解。
归并排序
按照分治三步法对归并排序算法介绍如下。 划分问题把序列分成元素个数尽量相等的两半。 递归求解把两半元素分别排序。 合并问题把两个有序表合并成一个。
借鉴一下https://blog.csdn.net/yuehailin/article/details/68961304 的思想
首先考虑下如何将将二个有序数列合并。这个非常简单只要从比较二个数列的第一个数谁小就先取谁取了后就在对应数列中删除这个数。然后再进行比较如果有数列为空那直接将另一个数列的数据依次取出即可。
解决了上面的合并有序数列问题再来看归并排序其的基本思路就是将数组分成二组AB如果这二组组内的数据都是有序的那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了
可以将AB组各自再分成二组。依次类推当分出来的小组只有一个数据时可以认为这个小组组内已经达到了有序然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列再合并数列就完成了归并排序。
更简洁的代码
#includeiostream
using namespace std;
void merge_sort(int *a,int x,int y,int *t){if(y-x1){int mx(y-x)/2;int px,qm,ix;merge_sort(a,x,m,t);merge_sort(a,m,y,t);while(pm||qy){if(qy||(pma[p]a[q]))t[i]a[p];else t[i]a[q];}for(int ix;iy;i) a[i]t[i];}
} int main(){int a[100],b[100];for(int i0;i10;i){cina[i];}merge_sort(a,0,10,b);for(int i0;i10;i){coutb[i] ;}
}
分析一下这个代码的意思 if(qy||(p m a[p] a[q])) 这个意思是说如果右边的数组为空或者左边数组不为空而且左边的数小于右边那么就把左边的这个数放到临时空间 整体上来说先递归成一个数然后再进行合并