二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为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; }
时间: 2024-11-03 05:27:53