二分查詢的遞迴和非遞迴實現,二分查詢的擴充套件

2021-07-04 23:45:16 字數 2995 閱讀 9420

凡是有序陣列中的查詢問題,都應該聯絡二分查詢解決

// 遞迴二分查詢

int binarysearch(int nums, int left, int right, int key)

int mid = left + ((right - left) >> 1);

if (nums[mid] == key) else

if (nums[mid] > key) else

}

// 迭代二分查詢

int binarysearch2(int nums, int left, int right, int key) else

if (nums[mid] > key) else

}return -1;

}

有兩種可能的資料,可以對應兩種解決演算法。

相關問題:數字在排序陣列中的次數

假設在陣列中 nums 中查詢元素 key

對於第二種情況,用二分查詢 key 第一次和最後一次出現的位置,和普通二分查詢唯一不同在於:

當查詢到 nums[mid] == key 時

第二種情況原始碼實現:

// 方法二

// 如果重複的數字佔據陣列的比例很大時,如果用上述方法則複雜度為o(n)

// 因此採用二分查詢第乙個key和最後乙個key

int getfirstkey(int nums, int left, int right, int key);

int getlastkey(int nums, int left, int right, int key);

int counttimes2(int nums, int left, int right, int key)

int getfirstkey(int nums, int left, int right, int key) else

if (nums[mid] > key) else

}int getlastkey(int nums, int left, int right, int key) else

if (nums[mid] > key) else

}

#include 

#include

using

namespace

std;

template

void printarray(const t(&a)[len])

// 遞迴二分查詢

int binarysearch(int nums, int left, int right, int key)

int mid = left + ((right - left) >> 1);

if (nums[mid] == key) else

if (nums[mid] > key) else

}// 迭代二分查詢

int binarysearch2(int nums, int left, int right, int key) else

if (nums[mid] > key) else

}return -1;

}// 方法一

// 如果重複的數字佔據陣列的比例較小,用二分查詢,後向兩側遍歷

int counttimes(int nums, int left, int right, int key)

while (end <= right && nums[end] == key)

return count;

}// 方法二

// 如果重複的數字佔據陣列的比例很大時,如果用上述方法則複雜度為o(n)

// 因此採用二分查詢第乙個key和最後乙個key

int getfirstkey(int nums, int left, int right, int key);

int getlastkey(int nums, int left, int right, int key);

int counttimes2(int nums, int left, int right, int key)

int getfirstkey(int nums, int left, int right, int key) else

if (nums[mid] > key) else

}int getlastkey(int nums, int left, int right, int key) else

if (nums[mid] > key) else

}int main() ;

int size = sizeof(nums) / sizeof(nums[0]);

sort(nums, nums + size);

printarray(nums);

int key = 3;

cout

<< binarysearch(nums, 0, size - 1, key) << endl;

cout

<< binarysearch2(nums, 0, size - 1, key) << endl;

cout

<< key << " 出現的次數:"

<< counttimes(nums, 0, size - 1, key) << endl;

cout

<< key << " 出現的次數:"

<< counttimes2(nums, 0, size - 1, key) << endl;

}

執行結果

122

2333

3333

4556

781134599

3 出現的次數:7

3 出現的次數:7

[finished in

0.6s]

二分查詢實現(遞迴和非遞迴)

遞迴的二分查詢,查詢單個值 時間複雜度 log2n 有點像二叉排序樹的查詢 param arr 待查詢陣列,有序 param low param high param findval 待找值 return 待找值的下標,沒有返回 1 public static intbinarysearch int...

二分查詢 遞迴和非遞迴

二分查詢要求 資料儲存在順序儲存結構中 數字有序排放 原理 將陣列分為三部分,依次是左值,中值,右值 將要查詢的值和陣列的中值進行比較,若小於中值則在中值前 面找,若大於中值則在中值後面找,等於中值時直接返回。然後依次是乙個遞迴過程,將前半部分或者後半部分繼續分解為三部分。迴圈實現二分查詢 temp...

二分查詢(遞迴 非遞迴)

二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。使用條件 查詢序...