您的位置:首页 > 其它

查找数组中是否含有任意三元素组成三角形的算法

2009-05-07 15:00 330 查看
   这是本人今天去Exoweb上机笔试的题目, 最笨最原始的办法是三重循环.

  

   当然好的设计是必要的.

 

   我所想的方法是分治法,先把数组以a[i]为界分成两部分,左边比a[i]小,右边比a[i]大.

   接下来问题就变成了两个子问题了,左右两个子数组,再加上下面的三种情况

   (i) 左面数组取一个数,右面数组取一个数,a[i]三个数判断;

   (ii)左面取两个数与a[i]判断

   (iii)右面取两个数与a[i]判断

 

   那么问题T(n) = 2T(n/2) + f(n),其中f(n)复杂度为O(n^2),总程序时间复杂度为O(n^2)

   

   先写一个判定组成三角开的函数

  
int valid(int a,int b,int c)
{
return a+b>c && a+c>b && b+c>a;
}


   再写一个分堆函数,即快速排序里的前一步

  
int partion(int * a,int p,int q)
{
int i,j;
for(i = p-1,j = p;j<q;++j)
{
if(a[j] < a[q] && a[++i]> a[q])
swap(&a[i],&a[j]);
}
swap(&a[i+1],&a[q]);
return i+1;
}


   最后递归函数

  
int subtri(int * a,int p,int q)
{
int mid;
if(q-p+1 < 3)return 0;
mid = partion(a,p,q);
if(subtri(a,p,mid-1)||subtri(a,mid+1,q))return 1;
else
{
int l,r;
for(l = p;l<mid;l++)
for(r = mid+1;r <= q;++r)
{
if(valid(a[r],a[l],a[mid]))return 1;
}
for(l = p;l<mid;l++)
for(r = p;r<mid;r++)
{
if(r != l && valid(a[r],a[l],a[mid]))return 1;
}
for(l = mid+1;l<=q;l++)
for(r = mid+1;r<=1;r++)
{
if(r != l && valid(a[r],a[l],a[mid]))return 1;
}
}
return 0;
}


主函数调用

int main()
{
int a[] = {4,4,1,2,3,5,7,8,9};
printf("%d",subtri(a,0,8));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 c
相关文章推荐