算法第一次實驗報告:改寫二分搜索算法的思路與分析


 改寫二分搜索算法 思路與分析
 

題目來源:《計算機算法設計與分析》,王曉東

設a[0:n-1]是已排好序的數組,請改寫二分搜索算法,使得當x不在數組中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜索元素在數組中時,i和j相同,均為x在數組中的位置。

輸入格式:

輸入有兩行:

第一行是n值和x值; 第二行是n個不相同的整數組成的非降序序列,每個整數之間以空格分隔。

輸出格式:

輸出小於x的最大元素的最大下標i和大於x的最小元素的最小下標j。當搜索元素在數組中時,i和j相同。 提示:若x小於全部數值,則輸出:-1 0 若x大於全部數值,則輸出:n-1的值 n的值

輸入樣例:

在這里給出一組輸入。例如:

6 5
2 4 6 8 10 12

輸出樣例:

在這里給出相應的輸出。例如:

1 2
——————————————————————————————————分割線——————————————————————————————————————————————
思路:對於能夠找到的元素,只需要把這個下標再輸出一遍即可。
對於找不到的元素,我們從優化過的二分搜索算法着手。眾所周知,二分搜索算法的左指針和右指針會漸漸靠近,如果要輸出這個數離得最近的兩個下標,不妨分析left和right的接近情況。【這里我用的是left>right的遞歸條件,這樣子做除了簡化代碼,還有特殊用處】

 

 括號左右是每次遞歸傳遞給形參的left right的值。

找0:(0,3)->(0,0)->(0,-1)

找4:(2,3)->(3,3)->(3,2)

找6:(2,3)->(3,3)->(4,3)

【記住:mid=(l+r)/2會取整,mid每次都要+1或者-1】

可以發現,只要把返回-1前的左右兩個值調換順序,就是正確的輸出結果。這里我選擇用全局變量保存。

然后在主函數里面判斷是不是返回-1,以選擇不同的輸出方式。

時間復雜度:O(logn)【二分搜索,不解釋】空間復雜度O(n)

收獲:當你看到大概知道思路但是解不開的題目,在大腦里面模擬運行,可能就有意外收獲。

最后附上代碼

 

 1 #include<iostream>
 2 using namespace std;
 3 int leftnum=0;
 4 int rightnum=0;
 5 int binarysearch(int num[],int left,int right,int chazhao)
 6 {
 7     //findnum++;
 8     int mid;
 9     if(left>right)
10     {
11         //cout<<"zhaobudao";
12         leftnum = left;
13         rightnum = right;
14         return -1;
15     }
16     else
17     {
18         mid=(left+right)/2;
19         if(num[mid]==chazhao)
20         {
21             return mid;
22         }
23         else if(num[mid]!=chazhao)
24         {
25             if(chazhao>num[mid])
26             {
27                 return binarysearch(num,mid+1,right,chazhao);
28             }
29             else return binarysearch(num,left,mid-1,chazhao);
30         }
31     }
32 }
33 
34 
35 int main()
36 {
37     int num[1000];
38     int i,chazhao,n;
39     cin>>n;
40     cin>>chazhao;
41     for(i=0;i<n;i++)
42     {
43         cin>>num[i];
44     }
45     
46     int date = binarysearch(num,0,n-1,chazhao);
47     
48     if(date == -1){
49         cout<<rightnum<<" "<<leftnum;
50         
51     }
52     else
53     {
54         cout<<date<<" "<<date;
55     }
56 
57 } 

 

 

 




免責聲明!

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



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