/*
* Copyright (c) 2012, 烟台大学计算机学院
* All rights reserved.
* 作 者: 刘同宾
* 完成日期:2012 年 11 月 27 日
* 版 本 号:v1.0
* 输入描述:
* 问题描述:有15个数按从大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出 “无此数”
* 程序输出:
* 问题分析:略
* 算法设计:略
*/
#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[i];
if(a[i]>=a[i-1])
{
i++;
}
else
cout<<"再次输入这个数据(enter this data again)";
}
cout<<endl;
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
while(flag)
{
cout<<"输入要寻找的数据(input number to look for):";
cin>>number;
sign=false; //sign 为假表示尚未找到
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; //只需从下标为0~mid-1的范围中找
}
else //如果要查找的数不小于中间元素的值
top=mid-1; //只需从下标为mid-1~bott的范围找
}
if((!sign)||loca==-1) //sign为假或者loca=-1,意味着找不到
{
cout<<number<<"无此数!(has not found)"<<endl;
}
cout<<"继续查找还是?(continue or not(Y/N))";
cin>>c;
if(c=='n'||c=='N')
{
flag=false; //flag为开关变量,控制程序是否结束运行。
}
}
return 0;
}