折半查找

折半查找

折半查找(二分查找)对处理元素要求

  • 有序
  • 顺序存储结构

基本思想

就是每次查找中间元素和待查找元素比较

  • 如果相同,返回该位置
  • 不同,且中间元素大于待查元素,则从右半边查找
  • 不同,且中间元素小于待查元素,则从左半边查找

     注意:如果前边标记大于小于后边标记了,那就说明没找到

两种思路

递归

复制代码
#include <stdio.h>
int erfen_d(int *a, int begin, int end, int value)
{
    if (end >= begin)
    {
        int mid = (begin + end) / 2;
        if (a[mid] == value)
            return mid;
        else if(a[mid] > value)
            return erfen_d(a, begin, mid-1, value);
        else
            return erfen_d(a, mid+1, end, value);
    }
    return -1;
}
        
int main()
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    printf("%d**
",erfen_d(a, 0, 8, 9));//0是首位置,9是末位置, 9是待查元素
return 0; }
复制代码

迭代

复制代码
#include <stdio.h>
int erfen(int *a, int begin, int end, int value)
{
    while (end >= begin)
    {
        int mid = (begin + end) / 2;
        if (a[mid] == value)
            return mid;
        else if(a[mid] > value)
            end = mid - 1;
        else
            begin = mid + 1;
    }
    return -1;
}

        
int main()
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    printf("%d**
",erfen(a, 0, 8, 1)); //0是首位置,9是末位置, 1是待查元素
    return 0;
}
复制代码

复杂度分析

查找过程就是找二叉排序树,元素所在的高度即查找的次数(注意:第一层高度为1)

满二叉排序树,有这样的特点:

  • 第h层最多元素个数:2k-1
  • 前h层最多元素个苏:2k-1

分析(元素个数为N,高度k)

 
 
原文地址:https://www.cnblogs.com/Leo_wl/p/3164993.html