理解:
假设在有序的100个数中找到某一个数字a,那么就先找到中间值mid,如果a>mid,那就缩小一半的范围,将mid设为最小边界,在mid到100中查找这个数字,计算新的mid=(min+100)/2,如果这个值还大于mid,那就再缩小一般的范围,设置最小边界为mid,继续查找,每次查找都将查找范围分割(缩小)一半,所以叫二分查找法,如图所示,在100的范围内查找15,不断将中间值与15进行比较来缩小范围,确定新的边界:
实现代码如下:
static int Search(int[] arr, int value)
{
int top = arr.Length - 1;
int bottom = 0;
int mid = 0;
while (bottom <= top)
{
mid = (bottom + top) / 2;
if (arr[mid] == value)
{
return mid;
}
else
{
if (value > arr[mid])
bottom = mid + 1;
else
top = mid - 1;
}
}
return -1;
}
因为在二分查找中会不断地分割数组进行重复操作,直到找到结果为止,这很符合递归的思想,因此递归二分查找算法便诞生了:
static int RecursionSearch(int value,int[] arr, int bottom, int top)
{
if (bottom > top)
return -1;
else
{
int mid = (int)(bottom + top) / 2;
if (value>arr[mid])
{
return RecursionSearch(value,arr,mid + 1, top);
}
else if(value==arr[mid])
{
return mid;
}else
{
return RecursionSearch(value, arr, bottom, mid - 1);
}
}
}
完整代码如下:
class Program
{
static void Main(string[] args)
{
int[] arr = new int[10] { 5, 78, 96, 52, 569, 22, 36, 48, 99, 75 };
Console.WriteLine("Before sort:");
Show(arr);
Console.WriteLine("After sort:");
InsertionSort(arr);
Show(arr);
for (int i = 0; i < arr.Length; i++)
{
int pos = RecursionSearch(arr[i], arr, 0, 10);
if (pos > -1)
{
Console.WriteLine("The number has been found:" + arr[pos] + "\n");
Show(arr);
}
else
{
Console.WriteLine("404 Not Found!");
}
}
}
static void Show(int[] arr)
{
foreach (var item in arr)
Console.Write(item + "\t");
Console.WriteLine();
}
//插入排序法
static void InsertionSort(int[] arr)
{
int temp, origin;
for (int i = 1; i < arr.Length; i++)
{
temp = arr[i];
origin = i;
while (origin > 0 && arr[origin - 1] > temp)
{
arr[origin] = arr[origin - 1];
origin--;
}
arr[origin] = temp;
}
}
static int RecursionSearch(int value,int[] arr, int bottom, int top)
{
if (bottom > top)
return -1;
else
{
int mid = (int)(bottom + top) / 2;
if (value>arr[mid])
{
return RecursionSearch(value,arr,mid + 1, top);
}
else if(value==arr[mid])
{
return mid;
}else
{
return RecursionSearch(value, arr, bottom, mid - 1);
}
}
}
}
运行结果: