黑马程序员技术交流社区

标题: 【手打】二分/折半查找数组元素 [打印本页]

作者: 悄然林静    时间: 2016-7-28 23:10
标题: 【手打】二分/折半查找数组元素
题目:有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。
分析:比较经典的题目了,先遍历一维数组,判断输入的数是否在数组中,若在则继续用二分法找出元素的位置。
代码如下:
[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;
int main()
{ const int n=7;
  int i,number,top,bott,mid,loca,a[n];
  bool flag=true,sign;
  char c;
  cout<<"enter data:"<<endl;;
  cin>>a[0];
  i=1;
  while(i<n)
   {cin>>a;
    if (a>=a[i-1])
      i++;
    else
      cout<<"enter this data again:";
   }
  cout<<endl;
  for (i=0;i<n;i++)
    cout<<a<<" ";
  cout<<endl;
  while(flag)
    {cout<<"input number to look for:";
     cin>>number;
     sign=false;
     top=0;            //top是查找区间的起始位置
     bott=n-1;         //bott是查找区间的最末位置
     if ((number<a[0])||(number>a[n-1]))  //要查的数不在查找区间内
       loca=-1;        // 表示找不到
     while ((!sign) && (top<=bott))
       {mid=(bott+top)/2;
        if (number==a[mid])
         {loca=mid;
          cout<<"Find "<<number<<", its position is "<<loca+1<<endl;
                  sign=true;
         }
        else if (number<a[mid])
         bott=mid-1;
        else
        top=mid+1;
       }
     if(!sign||loca==-1)
       cout<<number<<" has not found."<<endl;;
     cout<<"continu or not(Y/N)?";
     cin>>c;
     if (c=='N'||c=='n')
           flag=false;
    }
   return 0;
}

作者: 悄然林静    时间: 2016-7-28 23:14
沙发挽尊~~
作者: 徐荘    时间: 2016-7-29 22:36
佩服,很不错




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2