分治算法:分治算法就是把一个复杂的问题分成两个相同或相似的子问题,再把子问题分成更小的子问题......知道最后的子问题可以简单地求解,原问题的解即子问题的解的合并。
典型的分治算法就是二分搜索:
二分搜索递归的代码:
#include<stdio.h>
int key, a[20];
int search(int bot, int top)
{
int mid;
if(top >= bot) //第二次错误,此处为if,写成了while
{
mid = (top + bot) / 2; //第一次错误,此处应该为加号写成了减号
if(key == a[mid])
{
printf("%d\n", mid);
return 0;
}
else if(key < a[mid])
{
search(bot, mid - 1);
}
else
{
search(mid + 1, top);
}
}
}
int main(void)
{
int n, i;
scanf("%d", &n);
for(i = 1; i <= n; i ++)
{
scanf("%d", &a[i]);
}
scanf("%d", &key);
search(1, n);
return 0;
}
第一次错误是:应该为 mid = (bot + top) / 2; 而我写成了 mid = (top - bot) / 2。
第二次错误是:递归条件应该是if(bot <= top); 而我写成了while(bot <= top)。当递归二分时,要用if(bot <= top);当非递归二分时,要用while(bot <= top)。
二分搜索非递归代码:
#include<stdio.h>
int key, a[20], n;
void half(void)
{
int bot = 1, top = n, mid; //第一次错误,忘记给bot和top赋初值
while(bot <= top)
{
mid = (bot + top) / 2;
if(key == a[mid])
{
printf("%d\n", mid);
break;
}
else if(key < a[mid])
{
top = mid - 1;
}
else
{
bot = mid + 1;
}
}
return;
}
int main(void)
{
int i;
scanf("%d", &n);
for(i = 1; i <= n; i ++)
{
scanf("%d", &a[i]);
}
scanf("%d", &key);
half();
return 0;
}
第一次错误:忘记给bot和top赋初值