了解二分搜索

    在本教程中,您将学习二分搜索排序的工作方式。此外,您还将找到C语言的示例。
    二分搜索是一种搜索算法,用于在排序数组中查找元素的位置。
    在这种方法中,总是在部分数组的中间搜索元素。
    二分搜索只能在已排序的列表上实现。如果元素还没有排序,我们需要先对它们排序。

二分搜索如何工作?

    二分搜索算法可以通过以下两种方式实现。

  1. 迭代法
  2. 递归法

    递归方法遵循分治方法。
    下面讨论这两种方法的步骤。

  1. 待搜索的数组是:
    在这里插入图片描述
    假设 x = 4是要搜索的元素。
  2. 在最低和最高位置分别设置两个指针 low 和 high。
    在这里插入图片描述
  3. 找到数组的中间元素 mid,例如 arr[(low + high)/2] = 6。
    在这里插入图片描述
  4. 如果x == mid,则返回mid,否则将要搜索的元素与mid进行比较。
  5. 如果x>mid,则将x与mid右侧元素的中间元素进行比较。这可以通过将low设置为low=mid+1来完成。
  6. 否则,将x与mid左侧元素的中间元素进行比较。这可以通过将high设置为high=mid-1来完成。
    在这里插入图片描述
  7. 重复步骤3到6,直到 low 遇到 high。
    在这里插入图片描述
  8. 找到 x = 4。
二分搜索伪代码

    迭代法

do until the pointers low and high meet each other.
    mid = (low + high)/2
    if (x == arr[mid])
        return mid
    else if (x > arr[mid]) // x is on the right side
        low = mid + 1
    else                       // x is on the left side
        high = mid - 1

    递归法

binarySearch(arr, x, low, high)
    if low > high
        return False 
    else
        mid = (low + high) / 2 
        if x == arr[mid]
            return mid
        else if x < arr[mid]        // x is on the right side
            return binarySearch(arr, x, mid + 1, high)
        else                               // x is on the right side
            return binarySearch(arr, x, low, mid - 1)
C示例

    迭代法

// Binary Search in C

#include <stdio.h>

int binarySearch(int array[], int x, int low, int high) {
    
    
  // Repeat until the pointers low and high meet each other
  while (low <= high) {
    
    
    int mid = low + (high - low) / 2;

    if (array[mid] == x)
      return mid;

    if (array[mid] < x)
      low = mid + 1;

    else
      high = mid - 1;
  }

  return -1;
}

int main(void) {
    
    
  int array[] = {
    
    3, 4, 5, 6, 7, 8, 9};
  int n = sizeof(array) / sizeof(array[0]);
  int x = 4;
  int result = binarySearch(array, x, 0, n - 1);
  if (result == -1)
    printf("Not found");
  else
    printf("Element is found at index %d", result);
  return 0;
}

    递归法

// Binary Search in C

#include <stdio.h>

int binarySearch(int array[], int x, int low, int high) {
    
    
  if (high >= low) {
    
    
    int mid = low + (high - low) / 2;

    // If found at mid, then return it
    if (array[mid] == x)
      return mid;

    // Search the left half
    if (array[mid] > x)
      return binarySearch(array, x, low, mid - 1);

    // Search the right half
    return binarySearch(array, x, mid + 1, high);
  }

  return -1;
}

int main(void) {
    
    
  int array[] = {
    
    3, 4, 5, 6, 7, 8, 9};
  int n = sizeof(array) / sizeof(array[0]);
  int x = 4;
  int result = binarySearch(array, x, 0, n - 1);
  if (result == -1)
    printf("Not found");
  else
    printf("Element is found at index %d", result);
}
二分搜索复杂度

    时间复杂度

  • 最佳情况复杂度:O(1)
  • 平均情况复杂度:O(log n)
  • 最差情况复杂度:O(log n)

    空间复杂度
    二分搜索的空间复杂度为 O(n)。

二分搜索的应用
  • 应用于Java, .Net, C++ STL库中
  • 在调试时,二分搜索用于确定错误发生的位置
参考文档

[1]Parewa Labs Pvt. Ltd.Binary Search[EB/OL].https://www.programiz.com/dsa/binary-search,2020-01-01.

猜你喜欢

转载自blog.csdn.net/zsx0728/article/details/115047976
今日推荐