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