5、折半查找(二分查找)
簡介:
折半查找只能用於已經排過序的數據。 沒排過序的就只能用順序查找法。
折半查找法效率比較高, 100萬個數據可能只需要查找20次, 而順序查找可能就要找50,0000次
int BinarySearch(int* List, const int N, const int X)
{
// 先假設有一個數組, 是從1-100W排過序的數組。
int Lower = 0, Upper = N - 1, Mid; // 最小數/最大數/中間數
// 如果 最小數 還小於等於 最大數,那表明折半還沒結束,繼續折半循環查找。
while (Lower <= Upper)
{
// 中間數 = 最小數 + 最大數(在上邊已經-1) / 2。
Mid = (Lower + Upper) / 2;
// 如果這個中間數剛好就是要找的數,就返回它的下標。
if (List[Mid] == X) return Mid;
// 如果 中間數 不是我們要找的,那就比較一下要找的數比 中間數 小還是大。
else if (List[Mid] < X)
{
// 進來這條語句了,那說明要找的數肯定比 中間數 大
/* 把 最小數 等於 中間數 + 1,根據剛開始的假設,Mid現在 = 50W
也就是把 最小數 設置50W01,然後繼續折半查找。 */
Lower = Mid + 1;
}
// 如果 要找到的數 小於 中間數,那比 中間數 大的數就不用找了
else if (List[Mid] > X)
{
// 也就是說 從 499999 個數開始找
Upper = Mid - 1;
}
}
// 如果執行到這裏,表明循環都結束了,還沒找到要找的數並返回這個數的下標,那就表示執行失敗。
return -1;
}
int main()
{
int NumA[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };
int NumA_Size = sizeof(NumA) / sizeof(int);
int numa;
cout << "請輸入一個要查找的數字(1-20) >";
cin >> numa;
// 這個函數返回找到的數的下標,而不是數字本身。
int ResultA = BinarySearch(NumA, NumA_Size, numa);
if (ResultA == -1)
{
cout << "數字未找到!" << endl;
}
else
{
cout << "數字 >" << numa << "被找到!下標是 >" << ResultA << endl;
}
return 0;
}
備註:使用二分查找必須保證數據已經被排序!沒被排序的可以用慢方法:順序查找。
順序查找法:https://blog.csdn.net/WenRou21_/article/details/105756140