二分查找法

来源:互联网 发布:乐高淘宝店 编辑:程序博客网 时间:2024/05/21 00:16

        二分查找法是将数据分割成两等份,再比较键值与中间值的大小,如果键值小于中间值,则可以确定要查找的数据在前半段,否则在后半段,如此分割多次直到找到或确定要找的数据不存在为止。由此可见,使用二分查找法的前提是数据已经事先排好序了。二分查找法适用于数据量不是非常大的(必须要能直接在内存中执行)且已经排好序的、不需要增删的静态数据。时间复杂度为O(log n),最多只需比较log₂n+1或log₂(n+1)次。

#include <iostream>#include <cstdlib>#include <iomanip>using namespace std;const int iCount = 60;int iarr[iCount] = {0};int iFound = 0;void fnRandArr()  {  int iTemp = 1;    for(int i = 0;i < iCount;i++)      {          iarr[i] = iTemp; iTemp += rand() % 3;    }      cout << "输出数组为:" << endl;      for(int k = 0;k < 6;k++)      {          for(int j = 0;j < 10;j++)          {              cout << setw(2) << k * 10 + j + 1 << "[" << setw(2) << iarr[k*10+j] << "]  ";          }          cout << endl;      }  } int fnBinarySearch(int iarr[iCount],const int iKey){    int iMin;int iMax;int iMiddle;iMin = 0;iMax = iCount - 1;while((iMin <= iMax) && (iKey != -1)){iMiddle = (iMin + iMax) / 2;if(iKey < iarr[iMiddle]){cout << iKey << "在最小值" << iMin + 1 << "[" << setw(2) << iarr[iMin] << "]和中间值"<< iMiddle + 1 << "["<< setw(2) << iarr[iMiddle] << "]之间,找前半段" << endl;iMax = iMiddle - 1; }else if(iKey > iarr[iMiddle]){            cout << iKey << "在中间值" << iMiddle + 1 << "[" << setw(2) << iarr[iMiddle] << "]和最大值" << iMax + 1 << "[" << setw(2) << iarr[iMax] << "],找后半段" << endl;   iMin = iMiddle + 1;}else{    return iMiddle;}}return -1;}int main(){int iPosition;int iKey;fnRandArr();while(true){  iPosition = 0;cout << "请输入" << iarr[iCount-1] << "以内的正数作为键值,退出输入-1:";cin >> iKey;if(-1 == iKey){break;}iPosition = fnBinarySearch(iarr,iKey);if(-1 == iPosition){cout << "没有找到"<< iKey <<endl;}else{cout << "在第" << setw(2) << iPosition + 1 << "个位置找到[" << setw(2) << iarr[iPosition] << "]" <<endl;}}return true;}



原创粉丝点击