分治法——归并排序

来源:互联网 发布:淘宝 排名 编辑:程序博客网 时间:2024/06/04 23:20


分治法是解决一类问题的思想。所谓“分治”,就是分而治之,它有三个步骤:分解、解决与合并,将一个大问题分解成若干的小问题,使用递归的思想逐步解决。典型的例子就是合并排序。

#include<iostream>using namespace std;void merge(int a[],int p,int q,int r){int const max=10000;int i,j,k,L[100],R[100];int n1=q-p+1;int n2=r-q;for(i=0;i<n1;i++)L[i]=a[i+p];for(i=0;i<n2;i++)R[i]=a[q+i+1];L[n1]=max;R[n2]=max;i=0;j=0;for(k=p;k<=r;k++){if(L[i]<=R[j]){a[k]=L[i];i++;}else{a[k]=R[j];j++;}}}void merge_sort(int a[],int p,int r){if(p<r){int q=(p+r)/2;merge_sort(a,p,q);merge_sort(a,q+1,r);merge(a,p,q,r);}}int main(){int i,a[100],n;cin>>n;for(i=0;i<n;i++)cin>>a[i];merge_sort(a,0,n-1);for(i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;return 0;}
其实合并还有一种思路,就是不使用max,当L数组或R数组全部复制到a数组后,立刻停止,把另一个数组余下元素复制到a数组。

0 0
原创粉丝点击