【数据结构与算法】二分查找法(C++、Python)

    技术2022-07-11  133

    原理:

    查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果待查找元素大于中间元素,则在数组中大于中间元素的那一半中查找(注意此时最小的索引和中间值的索引的关系);如果待查找元素小于中间元素,则在数组中小于中间元素的那一半中查找(注意此时最大的索引和中间值的索引的关系)。而且与开始时一样,从中间元素开始比较,如果在某一步骤数组为空,则代表找不到。这种查找算法每一次比较都使得搜索范围缩小一半!

    程序实现(C++):

    //假设待查找的数组已经排好序,且从大到小排序! void binary_search(int *p) //把数组名当做参数传递进来! { int x, n, low, high, flag, mid; cout << "输入要查找的元素:"; cin >> x; low = 0; high = n - 1; flag = 0; //用标志位来判断找到与否! while (low <= high && !flag) { mid = (low + high) / 2; if (x < p[mid]) high = mid - 1; else if (x == p[mid]) flag = 1; else low = mid + 1; } if (flag) //如果找到! cout << x << "是数组中第" << mid + 1 << "个元素。" << endl; else cout << "数组中没有这个元素!" << endl; }

    程序实现(Python):

    # 用递归的方法实现二分查找!!!如果找到,则返回待查找元素在数组中的索引,否则返回 -1 def binary_search(arr, m, n, x): mid = int(m + (n - m) / 2) # 元素的中间位置 if arr[mid] == x: return mid # 要查找的元素小于中间位置元素的值,则只需要再比较左半边的元素 elif arr[mid] > x: return binary_search(arr, m, mid - 1, x) # 要查找的元素大于中间位置元素的值,则只需要再比较右半边的元素 elif arr[mid] < x: return binary_search(arr, mid + 1, n, x) else: return -1 # 不存在 if __name__ =='__main__': arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] x = eval(input("输入待查找的元素的值:")) n = len(arr) low, high = 0, n - 1 # 函数调用 if len(arr) > 0: result = binary_search(arr, low, high, x) if result != -1: print("元素在数组中的索引为:{}".format(result)) else: print("元素不在数组中")
    Processed: 0.010, SQL: 9