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