[算法][二分法查找]


 

 

 1 /*
 2 二分法實驗
 3 1、設a[0:n-1]是一個已排好序的數組.
 4 請改寫二分搜索算法,使得當搜索元素x不在數組中時,
 5 返回小於x的最大元素的位置I和大於x的最大元素位置j.
 6 當搜索元素在數組中時,I和j相同,均為x在數組中的位置.
 7 2、設有n個不同的整數排好序后存放於t[0:n-1]中,
 8 若存在一個下標I,0<=i<n,使得t[i]=i,
 9 設計一個有效的算法找到這個下標.
10 要求算法在最壞的情況下的計算時間為O(logn).
11 */
12 #include<iostream>
13 using namespace std;
14 /*
15 功能:1\二分查找改進版
16 輸入:拍好序的a[],大小n,待查數x,返回參數i,j
17 返回:真:找到
18 */
19 bool BinarySearch(int *a,int n,int x,int& i,int& j){
20     int left=0;
21     int right=n-1;
22     while(left<=right){
23         int mid=(left+right)/2;
24         if(x==a[mid]){
25             i=j=mid;
26             return true;
27         }
28         if(x>a[mid])
29             left=mid+1;
30         else
31             right=mid-1;
32     }
33     i=right;
34     j=left;
35     return false;
36 }
37 /*
38 功能:2\高效查找
39 輸入:數組,大小,待查值
40 返回:下標,若沒有返回-1
41 */
42 int SearchTag(int *a,int n,int x){
43     int left=0;
44     int right=n-1;
45     while(left<=right){
46         int mid=(left+right)/2;
47         if(x==a[mid]) return mid;
48         if(x>a[mid])
49             left=mid+1;
50         else
51             right=mid-1;
52     }
53     return -1;
54 }
55 int main(){
56     int n,i,j,a[1000],x;
57     while(cin>>n){//輸入數組大小
58         for(i=0;i<n;i++)cin>>a[i];//輸入數據,需要從小到大
59         cin>>x;//輸入待查數據
60         BinarySearch(a,n,x,i,j);//超找
61         cout<<"用函數1找到的i,j為: "<<'('<<i<<','<<j<<')'<<'\n';//輸出對應的i,j
62         cout<<"用函數2找到的下標為: "<<SearchTag(a,n,x)<<"\n\n";//輸出2找到的下標
63     }return 0;
64 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM