#include <iostream>
using namespace std;
int main( )
{
int a[15]={20,19,16,15,14,13,12,10,9,7,6,5,3,2,1};
int max,min,mid,x,i,n;
min=1,max=20,mid=20;n=0;
cout<<"please input a number: ";
cin>>x;
for(;min<=max;)
{
if(x==mid)
{
for(i=0;i<15;i++)
{if(a[i]>x) n=n+1;}
cout<<"此数为第 "<<n+1<<"个元素的值"<<endl;break;}
mid=(min+max)/2;
if(x<mid) max=mid-1;
if (x>mid) min=mid+1;}
if (x!=mid) cout<<"无此数"<<endl;
return 0;}
这个是我码的,不过似乎有个BUG,就是输入4、8、11等之内的数时还是显示有此数而且有说第几个,是他后面的那个数。比如11就是显示第8个,而第8个数其实是10……
怎么改……
æåæ¥æ¾æ³æ¯ç®æ³ä¸ç§ï¼å¯ä»¥è¢«ä»»ä½è®¡ç®æºè¯è¨ä½¿ç¨ãç¨Cè¯è¨èªç¶ä¹å¯ä»¥å®ç°ã
1ãå®ä¹ï¼
å¨è®¡ç®æºç§å¦ä¸ï¼æåæç´¢ï¼è±è¯ï¼half-interval searchï¼ï¼ä¹ç§°äºåæç´¢ï¼è±è¯ï¼binary searchï¼ã对æ°æç´¢ï¼è±è¯ï¼logarithmic searchï¼ï¼æ¯ä¸ç§å¨æåºæ°ç»ä¸æ¥æ¾æä¸ç¹å®å ç´ çæç´¢ç®æ³ã
æç´¢è¿ç¨ä»æ°ç»çä¸é´å ç´ å¼å§ï¼å¦æä¸é´å ç´ æ£å¥½æ¯è¦æ¥æ¾çå ç´ ï¼åæç´¢è¿ç¨ç»æï¼å¦ææä¸ç¹å®å ç´ å¤§äºæè å°äºä¸é´å ç´ ï¼åå¨æ°ç»å¤§äºæå°äºä¸é´å ç´ çé£ä¸åä¸æ¥æ¾ï¼èä¸è·å¼å§ä¸æ ·ä»ä¸é´å ç´ å¼å§æ¯è¾ãå¦æå¨æä¸æ¥éª¤æ°ç»ä¸ºç©ºï¼å代表æ¾ä¸å°ãè¿ç§æç´¢ç®æ³æ¯ä¸æ¬¡æ¯è¾é½ä½¿æç´¢èå´ç¼©å°ä¸åã
2ãæ¥æ¾è§åï¼
æåæ¥æ¾æ³æ¯æçè¾é«çä¸ç§æ¥æ¾æ¹æ³ãå设æå·²ç»æç §ä»å°å°å¤§ç顺åºæå好çäºä¸ªæ´æ°a0~a4ï¼è¦æ¥æ¾çæ°æ¯Xï¼å ¶åºæ¬ææ³æ¯ï¼ 设æ¥æ¾æ°æ®çèå´ä¸é为l=0ï¼ä¸é为h=4ï¼æ±ä¸ç¹m=ï¼l+hï¼/2ï¼ç¨Xä¸ä¸ç¹å ç´ amæ¯è¾ï¼è¥Xçäºamï¼å³æ¾å°ï¼åæ¢æ¥æ¾ï¼å¦åï¼è¥X大äºamï¼æ¿æ¢ä¸él=m+1ï¼å°ä¸å段继ç»æ¥æ¾ï¼è¥Xå°äºamï¼æ¢ä¸éh=m-1ï¼å°ä¸å段继ç»æ¥æ¾ï¼å¦æ¤éå¤åé¢çè¿ç¨ç´å°æ¾å°æè l>h为æ¢ãå¦æl>hï¼è¯´æ没ææ¤æ°ï¼æå°æ¾ä¸å°ä¿¡æ¯ï¼ç¨åºç»æã
3ãCè¯è¨åè代ç ï¼
int bin_search(int A[],int n,int key){你对对半查找理解错了,你的min,max应该是下标而不是值
原理:类似于二分法解方程,二分查找首先比对序列中间的数是否是要找的数,如果不是,由于是有序数列,则看其在左侧区间还是右侧区间,舍弃不在的那一半区间,然后在剩余的区间重复刚才的办法,直到找到该数,由于每次舍弃一半的数据量,所以查找效率较高。
描述:设三个变量 left,right,middle分别为序列的两侧下标和中间下标,当判断出不在左侧区间,则 left=middle+1 ,从而利用右侧一半构造出一个新区间,否则 right=middle-1,利用左边一侧构造新区间,然后重复刚才过程,如此下去,要么找到数据,要么left>right,此时也应该停止查找,说明序列中没有该数。
亲,你对折半查找的理解完全错误了。
min 和 max 不是指 容器中的最大元素 和最小元素,指的是元素在容器中的位置。
折半查找,仅仅要求容器内元素是 有序的就ok了。
我替你码的代码
#include <iostream>