目录
1 实验名称
分治法的应用
2 实验目的
通过本实验,掌握分治法解决问题的算法效率分析方法,运用分治法解决问题的思想,解决实际问题。
3 实验内容
利用分治法解决问题的方法解决合并排序、快速排序、折半查找、最近对问题和凸包问题,并对算法进行分析。打印输出。
4 实验设计及实现
4.1 凸包问题
#include<stdio.h>
#include<math.h>
#define N 5
int count=0;
void fenzhi1(int x[N],int y[N],int min,int max)
{
double smax=0,s;
int i,a=0;
for(i=min+1;i<max;i++)
{
s=x[min]*y[max]+x[i]*y[min]+x[max]*y[i]-x[i]*y[max]-x[max]*y[min]-x[min]*y[i];
if(s>smax){smax=s;a=i;}
count++;
}
if(a!=0)
{
printf("(%d,%d)\n",x[a],y[a]);
fenzhi1(x,y,min,a);
fenzhi1(x,y,a,max);
}
}
void fenzhi2(int x[N],int y[N],int min,int max)
{
double s,smin=0;
int i,b=0;
for(i=min+1;i<max;i++)
{
s=x[min]*y[max]+x[i]*y[min]+x[max]*y[i]-x[i]*y[max]-x[max]*y[min]-x[min]*y[i];
if(s>smin){smin=s;b=i;}
count++;
}
if(b!=0)
{
printf("(%d,%d)\n",x[b],y[b]);
fenzhi1(x,y,min,b);
fenzhi1(x,y,b,max);
}
}
void main()
{
int x[N],y[N],i;
printf("请分别输入五个点(按横坐标输入)!\n");
for(i=0;i<5;i++)
scanf("%d,%d",&x[i],&y[i]);
printf("分治法分别输出各极点为:\n");
printf("(%d,%d)\n(%d,%d)\n",x[0],y[0],x[N-1],y[N-1]);
fenzhi1(x,y,0,N-1);
fenzhi2(x,y,0,N-1);
printf("比较次数:%d\n",count);
}