二分查找算法(递归,循环)
二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,
2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。
二分查找算法就是不断将数组进行对半分割,每次拿中间元素和目标元素进行比较。
-
#include <iostream>
-
using namespace std;
-
-
//初始化数组为有序
-
bool initArray(int *Array, int arraySize)
-
{
-
for (int i = 0; i != arraySize; ++i)
-
{
-
Array[i] = i;
-
}
-
return true;
-
}
-
-
//递归二分
-
int binarySearchRecursion(int *Array, int item, int begin, int end)
-
{
-
if ((begin > end) || Array == NULL)
-
{
-
return -1;
-
}
-
-
int middle = begin + (end - begin)/2;
-
if (Array[middle] == item)
-
{
-
return middle;
-
}
-
else if (item > Array[middle])
-
{
-
return binarySearchRecursion(Array,item,middle+1,end);
-
}
-
else
-
{
-
return binarySearchRecursion(Array,item,begin,middle-1);
-
}
-
-
return -1;
-
}
-
-
//循环二分
-
int binarySearchLoop(int *Array, int item, int begin, int end)
-
{
-
if (Array == NULL)
-
{
-
return -1;
-
}
-
-
while (begin <= end)
-
{
-
int middle = begin + (end - begin)/2;
-
if (Array[middle] == item)
-
{
-
return middle;
-
}
-
else if (item > Array[middle])
-
{
-
begin = middle + 1;
-
}
-
else
-
{
-
end = middle - 1;
-
}
-
}
-
-
return -1;
-
}
-
-
-
int main()
-
{
-
-
int arraySize = 100;
-
int *Array = new int[arraySize];
-
initArray(Array,arraySize);
-
-
/*
-
在二分查找中,end应该指向的是数组的最后的一个元素,
-
而不是指向最后一个元素的下一个地址,
-
因为该元素是可以被二分查找的Middle指针搜索到的,因此传入的值为
-
arraySize-1
-
*/
-
cout << binarySearchRecursion(Array,-98,0,arraySize - 1) << endl;
-
cout << binarySearchLoop(Array,-56,0,arraySize - 1) << endl;
-
-
-
delete Array;
-
}
-