zoukankan      html  css  js  c++  java
  • 折半查找法的两种实现

     

    折半查找法的两种实现

    折半查找法的两种实现

    折半查找法:

    在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:

    1)     待查找数据值与中间元素值正好相等,则返回中间元素值的索引。

    2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。

    3)     待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值

    4)     如果最后找不到相等的值,则返回错误提示信息。

     

    按照二叉树来理解:中间值为二叉树的根,前半部分为左子树,后半部分为右子树。折半查找法的查找次数正好为该值所在的层数。等概率情况下,约为

    log2(n+1)-1

    1. int main(int argc, const char * argv[])

      {

          

          int searchArray[100];//要查找的数组

          for (int i = 0; i < 100; i++) {

              searchArray[i] = i + 1;

          }

          

          int index = 0;//要查找的数所在的索引

          int searchNum = 45;//需要查找的数

          //循环查找

          int searchIndex1(int array[],int const searchNum,int maxIndex,int minIndex);

          //递归查找

          int searchIndex2(int array[],int const searchNum,int maxIndex,int minIndex);

          

          index = searchIndex1(searchArray, searchNum, 99, 0);

          index = searchIndex2(searchArray, searchNum, 99, 0);

          printf("index = %d ",index);

          /*折半查找的思想是:

              将要查找数searchNum和数组中间的进行比较,如果searchNum < searchArray[midIndex],让最大索引maxIndex = midIndex -  1,如果searchNum > searchArray[midIndex]让最小索引minIndex = midIndex + 1,最终找到要查找的数。

           循环查找:

              while (minIndex <= maxIndex)作为循环判断,直到找到需要查找的数为止

           递归查找:

              递归是在searchNum != searchArray[midIndex]的时候调用自身,一直到找到要查找的数为止*/

          return 0;

      }

      int searchIndex1(int searchArray[],int const searchNum,int maxIndex,int minIndex)

      {

          if (minIndex > maxIndex) {

              return -1;

          }

          while (minIndex <= maxIndex) {

              

             int midIndex= (maxIndex + minIndex) / 2;

              if (searchNum == searchArray[midIndex]) {

                  printf("midIndex = %d ",midIndex);

                  return midIndex;

              }

              else if (searchNum < searchArray[midIndex])

              {

                  maxIndex = midIndex -  1;

              }

              else if (searchNum > searchArray[midIndex])

              {

                  minIndex = midIndex + 1;

              }

          }

          return -1;

      }

      int searchIndex2(int searchArray[],int const searchNum,int maxIndex,int minIndex)

      {

          if (minIndex > maxIndex) {

              return -1;

          }

          int midIndex = (maxIndex + minIndex) / 2;

          if (searchNum == searchArray[midIndex]) {

              printf("midIndex = %d ",midIndex);

              return midIndex;

          }

          else if (searchNum < searchArray[midIndex])

          {

              return searchIndex2(searchArray, searchNum, midIndex -  1, minIndex);

          }

          else if (searchNum > searchArray[midIndex])

          {

              return searchIndex2(searchArray, searchNum, maxIndex, midIndex + 1);

          }

          return -1;

      }

  • 相关阅读:
    nyoj256-C小加之级数求和
    nyoj254-编号统计
    nyoj286-动物统计
    最长回文子串——manacher
    动态规划:Codeforces Round #427 (Div. 2) C Star sky
    水题:51Nod1432-独木舟
    水题:HDU1716-排列2
    水题:CF16C-Monitor
    数学基础:HUD1124-Factorial(N!末尾0的个数)
    并查集:POJ1182-食物链(并查集比较高端的应用)
  • 原文地址:https://www.cnblogs.com/chenhaosuibi/p/3438945.html
Copyright © 2011-2022 走看看