二分查找的前提条件是数组有序,以整型升序数组为例
思想:在一个有序数组中(升序)查找某个值,每次将数组从中间一分为二,取头head,中间mid,尾tail。若mid值大于待查找的值,则把tail重新定位在mid的位子上,对从head到tail的“新”数组进行下一次二分;若mid值小于待查找的值,就把head重新定位在mid的位子上,对从head到tail的“新”数组进行下一次查找。
好的,现在开始写代码。
public static int BiSeach(int[] a, int n,int val)
{
int head, tail, mid;
head = 0;
tail = n;
int i;
for(i=0;i<tail ;i++)
{
}
}//这是第一段失败了的代码
for应该怎么去运行呢?
看来这样不行,得换一种写法。
static void Main(string[] args)
{
int[] a=new int []{0,1,2,3,4,5,6,7};
// int head, tail, mid;
int val;
Console.WriteLine("Input a number ");
val = Convert.ToInt32(Console.ReadLine());
int result = BiSeach(a, 8, val);
if (result>=0)
Console.WriteLine("found at a[{0}]", result);
Console.ReadKey();
}
public static int BiSeach(int[] a, int n,int val)
{
int head, tail, mid;
head = 0;
tail = n;
int i;
while (head <= tail)
{
mid = (head + tail) / 2;
if (val == a[mid])
return mid;
else if (a[mid] > val)
tail = mid;
else
head = mid;
}
Console.WriteLine("Not found!");
return -1;
}
这次看上去没错了吧?
经过运行,0~7确实都能找出来,但是这样就真的没有问题了么。。。。
于是,输入了8之后,它死循环了。
又经过了一番改动,终于没问题了。。。。
class Program
{
static void Main(string[] args)
{
int[] a=new int []{0,1,2,3,4,5,6,7};
// int head, tail, mid;
int val;
Console.WriteLine("Input a number ");
val = Convert.ToInt32(Console.ReadLine());
int result = BiSeach(a, 8, val);
if (result>=0)
Console.WriteLine("found at a[{0}]", result);
else
Console.WriteLine("Not found!");
Console.ReadKey();
}
public static int BiSeach(int[] a, int n,int val)
{
int head, tail, mid;
head = 0;
tail = n-1;
int i;
while (head <=tail)
{
mid = head + (tail-head) / 2;//判断到底有没有
if (val == a[mid])
return mid;
else if (a[mid] > val)
tail = mid-1;//mid不是,可以排除掉了
else
head = mid+1;
}
return -1;
}
}