分治算法
分治:把一个任务分成形式和原任务相同,但规模更小的几个部分任务(通常是两个部分),分别完成,或只需要选一部分完成。然后再处理完成后的这一个或几个部分的结果,实现整个任务的完成。
例题1:归并排序
数组排序任务可以如下完成:
a.把前一半排序
b.把后一半排序
c.把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。
/**
归并排序
先对前一半归并排序
再对后一半归并排序
最后将这两半合并成一段
*/
#include<iostream>
#define maxsize 100
using namespace std;
void merge(int a[],int left,int mid,int right,int b[])
{
int n=0;
int p1=left,p2=mid+1;
while(p1<=mid&&p2<=right)
{
if(a[p1]<a[p2])
b[n++]=a[p1++];
else
b[n++]=a[p2++];
}
while(p1<=mid)
b[n++]=a[p1++];
while(p2<=right)
b[n++]=a[p2++];
for(int i=0;i<right-left+1;i++)
a[left+i]=b[i];
}
void mergesort(int a[],int left,int right,int b[])
{
if(left<right)
{
int mid=left+(right-left)/2;
mergesort(a,left,mid,b);
mergesort(a, mid+1,right,b);
merge(a,left,mid,right,b);
}
}
int main()
{
int a[maxsize];int b[maxsize];
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
mergesort(a,0,n-1,b);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
6861



被折叠的 条评论
为什么被折叠?



