二分查詢另類 程式設計珠璣第四章

2021-06-20 01:26:21 字數 1597 閱讀 9489

這是《程式設計珠璣》第四章的問題:

如果最初的二分查詢對你來說太簡單了(大家肯定都是這麼感覺的...)那麼請你試一下其變型:在p中返回t在陣列x中第一次出現時的位置(即如果乙個陣列多次出現的話,原先的演算法所返回的是眾多位置的中的任意乙個)。你的**應該對陣列元素進行對數次比較,可能要進行log2n此這樣的比較才能完成此二分查詢。

這題的關鍵是找到最先開始出現的位置,如對陣列:;

若用之前的二分查詢演算法:

可是我們明顯可以發現5是在陣列中的第二個位置的(當然此時陣列下標是1);

最開始演算法經過二分查詢,首先mid = (low + high) = 5;查到了14,發現x < a[mid]; high = mid - 1 = 4;

mid  = 2;這時查到了5,最後輸出5在陣列中第三位(mid + 1)(陣列由下標0開始,各位別混了...)

可是現在我們需要查詢的是最先出現的,即在之前:

if(s[mid] == x)

return mid;

這個時候並不能返回mid,因為我們無法確認是否是第乙個出現;這時則應該繼續進行二分查詢,直到找不到符合條件為止:

即:

int mid;

int index = -1;

while(low <= high)

else if(s[mid] < x)

low = mid + 1;

else high = mid - 1;

}return index;

建立乙個標記的下標index,初始為-1,查到到目標資料,則對index進行修改;

最後返回index最後一次的值,這個值就是最先出現的值:

#include #include using namespace std;

int binarysearch(int* s, int x, int low, int high)

else if(s[mid] < x)

low = mid + 1;

else high = mid - 1;

}return index;

}int main()

; //遞增序列,也可運用動態陣列存資料

cout<

int num;

cin>>num;

int n = sizeof(s) / sizeof(int);

int index = binarysearch(s, num, 0, n - 1);

if(index >= 0) //根據返回值判斷是否在陣列中

cout<

當然若是想知道查詢目標是否多次出現,也可在if(s[mid] == x)裡面新增自己的標識,自行輸出即可,有興趣的可以試試...

測試資料較少,若有錯誤,請大家不吝賜教。

程式設計珠璣第四章

正文裡面涉及到程式設計方法學的內容。不再細述 1 加及條件是0 l u n 1 2 這個函式可以寫成如下形式 int bs int a,int begin,int end,int v if e a end e v return e a return 1 再給一段測試 include include ...

第四章 二分查詢(陣列)

習題 1.給定的l 和 h 的範圍包括 1 和 n兩個哨兵節點的範圍,n為0時,l和h 的最小值分別為 1,和 0 l 是 0,n h 是 1,n 使得 l h 的範圍在 1,2n 1 之間 同時,表明我們不會訪問陣列哨兵元素,因為哨兵是 l 1,和 u 1 l 1 最小是 1,u 1 最大是 n,...

第四章 程式設計

選擇語言的原則 最少的工作量原則 最少技巧性原則 最少錯誤原則 最少維護原則 減少記憶原則 總原則 先求正確後求快 先求清晰後求快 求快不忘保持程式正確性 保持程式整潔以求快 不要因效率而犧牲清晰 好程式標準 易於測試和除錯 易於維護 易於修改 設計簡單 高效率結構化程式設計主要包括兩方面 在編寫程...