C++數據結構與算法\折半查找(二分查找)BinarySearch()

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章