zoukankan      html  css  js  c++  java
  • 折半查找算法及分析(手工过程)

    折半查找的手工过程:

    1.我需要查找的数是10;

    给定:1  5  8  10  13 14  17  22  25  27  29  31  35  37  40  42  45  47  50  51  58

    下标:0  1  2   3   4    5    6    7     8    9   10  11  12  13  14  15  16  17  18  19  20

       h               m                  t

       h    m          t

       h m  t

         h   t

         m  h

           m

    这个手工过程到head = tail 时找到了。

    我需要查找的数是29;

    给定:1  5  8  10  13 14  17  22  25  27  29  31  35  37  40  42  45  47  50  51  58

    下标:0  1  2   3   4    5    6    7     8    9   10  11  12  13  14  15  16  17  18  19  20

       h               m                  t

    这个手工过程数在head < tail时程序停止,找到的是下标的那个数。

    代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    int binarySearch(int *arr,int count ,int data){
        int middle;
        int head = 0;
        int tail;
        tail =  count;
        while(arr[middle] != data){
            middle = (head + tail)/ 2;
            
            if(arr[middle] < data){
                head = middle + 1;
            }else if(arr[middle] > data){
                tail = middle - 1;
            }
        }    
        return middle;
        return -1;
    }
    int main(){
        int n = 0;
        int m ;
        int a[10]={1,4,8,9,16,17,19,20,25,27};
        printf("请输入需要查找的数: ");
        scanf("%d",&n);
        m = binarySearch(a,10,n);
        printf("%d ",m);
        return 0;
    }
     

    这是一个简单的折半处理,用的是一个简单的数组

    需要强调的是:

          如果要运用折半算法,数必须是有序的(升序或者降序)

          很多人都认为while(head > tail)这样也是正确的,但是对于middle = data时条件一直成立就会出现问题的!

  • 相关阅读:
    状态机的常见问题
    基于quartus的高级时序分析
    FPGA中的时钟域问题
    quartus中的时序约束常用方法
    时序约束与时序分析
    FPGA的PCB设计
    AXI4的主机协议代码分析
    selenium 笔记 场景判断
    Codeforces Round #676 (Div. 2) XORwice、Putting Bricks in the Wall、Palindromifier
    Trap HDU
  • 原文地址:https://www.cnblogs.com/youdiaodaxue16/p/9016337.html
Copyright © 2011-2022 走看看