1、二分查找概念
公司主營業(yè)務(wù):網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出長汀免費(fèi)做網(wǎng)站回饋大家。
二分查找又稱折半查找,優(yōu)點(diǎn)是比較次數(shù)少,查找速度快,平均性能好;其缺點(diǎn)是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用于不經(jīng)常變動(dòng)而查找頻繁的有序列表。首先,假設(shè)表中元素是按升序排列,將表中間位置記錄的關(guān)鍵字與查找關(guān)鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個(gè)子表,如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字,則進(jìn)一步查找前一子表,否則進(jìn)一步查找后一子表。重復(fù)以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時(shí)查找不成功。
2、二分查找簡單實(shí)現(xiàn)
(1)左開右閉 【 )
//非遞歸版本 int* BinarySearch(int *a,int n,int key) { if (a==NULL||n==0) { return NULL; } //[) int left=0; int right=n; while(left<right) //如果寫成left<=right 有可能越界 { int mid=left+(right-left)/2; if (a[mid]>key) { right=mid; //如果寫成right=mid+1 元素如果是a[0]=0,a[1]=1,要找1 //left=0,right=1,mid=0 //然后a[mid]<1,right=mid;此時(shí)找不到1,因?yàn)閘eft<right //所以當(dāng)為【)不要把未判斷元素直接做right的下標(biāo) } else if(a[mid]<key) { left=mid+1; } else { return a+mid; } } return NULL; } void testBinary() { int a[10]={0,1,3,5,45,78,98,111,121,454}; for (int i=9;i>=0;i--) { int *temp=BinarySearch(a,10,i); if(temp==NULL) { cout<<"NULL"<<endl; } else cout<<*temp<<endl; } } //遞歸版本 int * BinarySearch_R(int *a,int n,int key,int left,int right) { if(a==NULL||n==0) { return NULL; } if(left<right) { int mid=left+(right-left)/2; if(a[mid]>key) { return BinarySearch_R(a,n,key,left,mid); } else if(a[mid]<key) { return BinarySearch_R(a,n,key,mid+1,right); } else { return a+mid; } } else { return NULL; } } void testBinary_R() { int a[10]={0,1,3,5,45,78,98,111,121,454}; for (int i=9;i>=0;i--) { int *temp=BinarySearch_R(a,10,i,0,10); if(temp==NULL) { cout<<"NULL"<<endl; } else cout<<*temp<<endl; } }
(2)左閉右閉 【】
int* BinarySearch_C(int *a,int n,int key) { if(a==NULL||n==0) { return NULL; } //[] int left=0; int right=n-1; while(left<=right) { int mid=left+(right-left)/2; if(a[mid]>key) { right=mid-1; //a[mid]的值已經(jīng)判斷過了 } else if(a[mid]<key) { left=mid+1; //a[mid]已經(jīng)判斷過了 } else return a+mid; } return NULL; } void testBinary() { int a[10]={0,1,3,5,45,78,98,111,121,454}; for (int i=9;i>=0;i--) { int *temp=BinarySearch_C(a,10,i); if(temp==NULL) { cout<<"NULL"<<endl; } else cout<<*temp<<endl; } } //遞歸版本 int * BinarySearch_CR(int *a,int n,int key,int left,int right) { if(a==NULL||n==0) { return NULL; } if(left<=right) { int mid=left+(right-left)/2; if(a[mid]>key) { return BinarySearch_R(a,n,key,left,mid-1); } else if(a[mid]<key) { return BinarySearch_R(a,n,key,mid+1,right); } else { return a+mid; } } else { return NULL; } } void testBinary_R() { int a[10]={0,1,3,5,45,78,98,111,121,454}; for (int i=9;i>=0;i--) { int *temp=BinarySearch_CR(a,10,i,0,9); if(temp==NULL) { cout<<"NULL"<<endl; } else cout<<*temp<<endl; } }
題目:
正整數(shù)數(shù)組a[0], a[1], a[2], ···, a[n-1],n可以很大,大到1000000000以上,但是數(shù)組中每個(gè)數(shù)都不超過100。現(xiàn)在要你求所有數(shù)的和。假設(shè)這些數(shù)已經(jīng)全部讀入內(nèi)存,因而不用考慮讀取的時(shí)間。希望你用最快的方法得到答案。
提示:二分。
分享名稱:有關(guān)二分查找的邊界思考
文章URL:http://m.rwnh.cn/article14/jcjgge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、面包屑導(dǎo)航、動(dòng)態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航、用戶體驗(yàn)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)