zoukankan      html  css  js  c++  java
  • 基础算法之二分法查找

    二分查找算法C

    二分查找也属于顺序表查找范围,二分查找也称为折半查找。二分查找(有序)的时间复杂度为O(LogN)。

    二分查找的基本思想是, 在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给 定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。

    从二分查找的定义我们可以看出,使用二分查找有两个前提条件:

    1,待查找的列表必须有序。

    2,必须使用线性表的顺序存储结构来存储数据。

    二分法查找在针对大量有序排列的情况下发挥出很优越的效率,这里以最具规律性的数组为例,代码如下:

     1 #include <stdio.h>
     2 //二分查找
     3 int binary_search(const int c[], int l,int h,int key);
     4 void Display(int x);
     5 int a[]={15,8,100,46,22,56,34,79,98,66,200,11,300};
     6 int z=sizeof(a)/sizeof(int);
     7 int b[sizeof(a)/sizeof(int)];
     8 int t;
     9 int i;
    10 int main(int argc, const char * argv[]) {
    11     
    12     for (i=0; i<(sizeof(a)/sizeof(int)); i++) {
    13         b[i]=a[i];
    14     }
    15     //printf("%ld
    ",sizeof(a)/sizeof(int));
    16     
    17     for(i=0;i<(sizeof(a)/sizeof(int));i++)
    18     {
    19         for(int j=i;j<(sizeof(a)/sizeof(int));j++)
    20         {
    21             if(b[i]>b[j]) {
    22                 t=b[i];
    23                 b[i]=b[j];
    24                 b[j]=t;
    25             }
    26         }
    27     }
    28     printf("
    ");
    29     int m=0;
    30     int n=z;
    31     int w;
    32     int x;
    33     printf("请输入要查找的整数:");
    34     scanf("%d",&x);
    35     w=x;
    36    // getchar();
    37     int g;
    38     g=binary_search(b, m, n, w);
    39     Display(g);
    40     return 0;
    41 }
    42 
    43 int binary_search(const int c[], int l,int h, int key){
    44     while(l<= h)
    45     {
    46         int f = (l + h)/2;
    47         if(c[f]== key)
    48             return c[f] ;
    49         //在左半边
    50         else if(c[f] > key)
    51             h = f - 1;
    52         //在右半边
    53         else
    54             l = f + 1;
    55     }
    56     //没找到
    57     return -1;
    58 }
    59 
    60 //打印结果
    61 void Display(int x){
    62     if (x!=-1) {
    63         for(i=0;i<z;i++){
    64             if (x==a[i]) {
    65                 printf("所在位置:%d
    ",i);
    66             }
    67         }
    68     }
    69     
    70     else{
    71         printf("对不起,没有找到该数
    ");
    72     }
    73 }

    运行结果1:

    请输入要查找的整数:200
    所在位置:10
    Program ended with exit code: 0

    运行结果2:

    请输入要查找的整数:500
    对不起,没有找到该数
    Program ended with exit code: 0
  • 相关阅读:
    java并发编程——Excutor
    java并发编程——BlockingQueue
    const int *p和int * const p的区别(常量指针与指向常量的指针)
    C语言 enum作为函数返回值及函数参数
    (void)0;
    浅析IAR环境下Flash loader工作原理 (转)
    xilinx zcu106 vcu demo
    flashloader速度提升
    typora--简洁的markdown编辑器
    vivado 2019.2 工程修改文件夹名称后引起的一系列问题
  • 原文地址:https://www.cnblogs.com/hecheng0314/p/4372662.html
Copyright © 2011-2022 走看看