适用范围:
适用于在有序的一组数据中查找一个符合条件的数据
原理:
通过把数据分为前后两部分,判断数据在哪一部分,之后再把这个部分分为前后两部分,再次确定数据所在部分。循环调用直至找到数据,或者区间范围不能继续缩小。
代码:
产生随机的一组数据
static void Function5()
{
Random random = new Random();
int[] arr = new int[10];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = random.Next(0, 11);
Console.WriteLine("获得随机数" + arr[i]);
}
Array.Sort(arr);
int index = BinaryLookup(arr,10);
Console.WriteLine("获取到的索引为"+ index);
}
二分排序
static int BinaryLookup(int [] arr,int key)
{
//要查找的区间末尾索引
int right = arr.Length;
//要查找的区间开头索引
int left = 0;
while (true)//在要查找的区间内找数据
{
//mid将数据分为左右两半
int mid = (right + left) / 2;
//判断查找区间的中间索引是否符合条件
if (arr[mid] == key)
{
return mid;
}
//当中间数小于要找的数代表要找的数在右半区间
else if (arr[mid] < key)
{
//修改查找区间为右半区间
left = mid + 1;
}
//这里使用 else 也行,为了方便理解这里用else if表示
else if (arr[mid] > key)
{
//修改查找区间为左半区间
right = mid - 1;
}
//当查找区间超出范围代表这个数组中没有该数据或者该数组不符合初始条件
if (left >= arr.Length || right<0)
{
break;
}
}
//在该区间没有找到就返回-1;
return -1;
}