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

原创文章 9 获赞 9 访问量 356

猜你喜欢

转载自blog.csdn.net/WenRou21_/article/details/105756190