二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为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;
}原文地址:http://blog.csdn.net/zjf280441589/article/details/41076027