/*
一个循环有序数组,例如:7,8,9,0,1,2,3,4,5,6 不知道其最小值的位置,要查找任一数值的位置。算法时间复杂度是log2(n)。
关键是怎么确定关键字在左边还是在右边 (循环数组划分后肯定有一部分是有序的有一部分是无序的)
*/
public static int BinarySearch(List<int> list, int start, int end, int key)
{
int mid = (start + end) / 2;
if (key == list[mid])
return mid;
if (list[start] <= list[mid - 1])//左边有序
{
if (key >= list[start] && key<=list[mid-1])//在左边
{
return BinarySearch(list, start, mid - 1, key);
}
else//在右边
{
return BinarySearch(list, mid + 1, end, key);
}
}
else if (list[mid+1]<= list[end])//右边有序
{
if (key <= list[end] && key >= list[mid + 1])//在右边
{
return BinarySearch(list, mid + 1, end, key);
}
else//在左边
{
return BinarySearch(list, start, mid - 1, key);
}
}
return 0;
}
static void Main(string[] args)
{
List<int> list = new List<int>() { 4, 5, 6, 7, 8, 9, 0, 1, 2, 3 };
Console.WriteLine(BinarySearch(list, 0, list.Count-1, 8));
Console.Read();
}