zoukankan      html  css  js  c++  java
  • 折半查找算法

    计算机科学中,折半搜索,也称二分查找算法二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

    复杂度分析

    时间复杂度折半搜索每次把搜索区域减少一半,时间复杂度为O\left( \log n  \right)。(n代表集合中元素的个数)空间复杂度 O\left(  1  \right)。虽以递归形式定义,但是尾递归,可改写为循环。

    C代码如下:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<ctype.h>
     5 #include<stdbool.h>
     6 
     7 
     8 #define COMPARE(x,y) (((x) < (y)) ? -1 : ((x) == (y)) ? 0 : 1)
     9 
    10 /*
    11 int COMPARE(int x, int y)
    12 {
    13     if(x < y) {
    14         return -1;
    15     } else if(x == y) {
    16         return 0;
    17     } else {
    18         return 1;
    19     }
    20 }
    21 */
    22 
    23 
    24 /* 非递归代码 */
    25 int binsearch(int list[], int searchchnumm, int left, int right)
    26 {
    27     int middle;
    28     while(left <= right) {
    29         middle = (right + left)/2;
    30         switch(COMPARE(list[middle], searchchnumm)) {
    31             case -1:
    32                 left = middle + 1;
    33                 break;
    34             case 0:
    
    35                 return middle;
    36                 break;
    37             case 1:
    38                 right = middle -1;
    39                 break;
    40             default:
    41                 break;
    42             }
    43         }
    44         return -1;
    45 }
    46 
    47 
    48 
    49 /* 递归代码 */
    50 int binsearch(int list[], int searchchnumm, int left, int right)
    51 {
    52     int middle;
    53     if(left <= right) {
    54         middle = (left + right)/2;
    55         switch(COMPARE(list[middle], searchchnumm)) {
    56         case -1:
    57             return binsearch(list, searchchnumm, middle + 1, right);
    58             break;
    59         case 0:
    60             return middle;
    61             break;
    62         case 1:
    63             return binsearch(list, searchchnumm, left, middle - 1);
    64             break;
    65         default:
    66             break;
    67         }
    68     }
    69     return -1;
    70 }
    71 
    72 int main()
    73 {
    74     int list[] = {2,4,5,1,-3,6,8,10,55,23};
    75     int searchnum = 5;
    76     int length;
    77     length = sizeof(list) / sizeof(int);
    78     printf("%d\n",length);
    79     printf("%d\n",binsearch(list,searchnum,0,length));
    80     return 0;    
    81 }
    作者:cpoint
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    【原创】性能测试之——网络环境分析
    【转载】测试人员管理之——离职类型分析
    【转载】测试人员管理之——离职人员管理
    【转载】测试缺陷生命周期定义
    【转载】如何对软件测试方法分类
    【原创】Java批量反编译利器(jd-gui)介绍
    【原创】Linux常用管理命令总结
    shelve模块 xml模块
    json模块
    sys模块
  • 原文地址:https://www.cnblogs.com/cpoint/p/3367331.html
Copyright © 2011-2022 走看看