c++折半查找算法
何謂折半查找,舉個例子很快就可以明白,給你了9個數 1 2 3 4 5 6 7 8 9 讓你去找2在哪里,這時候你肯定會說這太簡單了,但是計算機就沒那么強了,它得拿著2和這9個數一個一個的比較,2在前面還好比較的次數比較小,但是如果讓你找6在哪呢,需要比較的次數就多了,可能你覺得多這一次兩次沒什么差別,但是如果1到10000個數讓你找呢,這時候折半查找的優勢就顯現出來了。我們先看2在不在1-5里面也就是前半段,如果在前半段,我們直接不和后邊的數進行比較,我們確定2在1到5里面之后,我們再用類似的辦法再去掉一半,看2在不在1到3面里,如果不在我們去3到5里找,如此下去直到找到為止,我們會發現計算機最擅長干的事就是迭代,而優秀的算法就是讓計算機迭代的次數少一點。c++用代碼實現如下
#include<iostream> using namespace std; int main() {const int n=10;int i,number,top,bott,mid,loca,a[n];//mid用bott和top表示,方便迭代。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++;elsecout<<"enter this data again:";//輸入已經排好序的數列,也可以加上冒泡排序自動排序}cout<<endl;for(i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;while(flag){cout<<"input number of to look for:";cin>>number;sign=false;top=0;bott=n-1;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;//舍去后一半elsetop=mid+1;}if(!sign||loca==-1)cout<<number<<"has not found"<<endl;cout<<"continue or not";cin>>c;if(c=='n'||c=='N')flag=false;}return 0; }輸入十個已經排好序的數,然后進行查找。
總結
- 上一篇: c语言图案问题,C语言绘图问题
- 下一篇: 指针递归调调用实现循环移位