IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法分析:C语言实现分治算法之二分搜索(折半查找)(递归)与线性查找的比较 -> 正文阅读

[数据结构与算法]算法分析:C语言实现分治算法之二分搜索(折半查找)(递归)与线性查找的比较

?二分搜索的伪码:

?二分搜索的解题思路:

              a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]
                1   2   3   4   5   6   7   8     K=3 //输入8位数的数组
  第一次查找:  low=1                       high=8
                mid=(1+8)/2=4       (int整型舍去小数部分)
                K=3<a[mid](a[4]=4)  舍去右边大于mid=4的数,这时    high=mid-1=3
                    ↓
               a[1]a[2]a[3]
                1   2   3      K=3
  第二次查找:  low=1   high=3
                mid=(1+3)/2=2
                K=3>a[mid](a[2]=2)  舍去左边小于mid=2的数,这时    low=mid+1=3
                    ↓
               a[3]
  第三次查找:  3      K=3
                
                

? ? ? ? 二分搜索的思路:对比查找元素K,如果刚刚好mid等于K则直接返回mid的位置,如果K大于mid,则把小于mid的数放弃掉,如果K小于mid?,则把大于mid的数放弃掉,相当于直接丢弃一半,一直丢弃,直到找到K等于mid。

?递归代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

int Binary_Search(int a[],int k,int low,int high)
{
    if(low>high)return 0;
    else{
        int mid=(low+high)/2;
        if(k==a[mid])return mid;
        else if(k<a[mid])return Binary_Search(a,k,low,mid-1);
        else return Binary_Search(a,k,mid+1,high);
    }
}
int main()
{
    int k,num;
    printf("数组元素个数:");
    scanf("%d",&num);
    int *a=(int*)malloc(num*sizeof(int));
    printf("输入已排序的数组:");
    for(int i=1;i<=num;i++) scanf("%d",&a[i]);
    while(1){
        printf("输入要搜索的值:");
        scanf("%d",&k);
        int m=Binary_Search(a,k,1,num);
        printf("%d的位置在第%d位\n\n",k,m);
    }

    return 0;
}

结果实现:

线性查找 :

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    int k;
    printf("查找元素:");
    scanf("%d",&k);
    for(int i=0;i<10;i++){
        if(k==a[i]){
            printf("%d在第%d位",k,i+1);
        }
    }
    return 0;
}

?????????我们可以想,明明可以用几行代码就可以实现一个有序数组的查找,可是为什么偏偏要弄得像二分搜索那样复杂呢??

? ? ? ? 可以直接从“线性查找”的代码看出来,它是一个一个的对比,从0开始到想要搜索的数(即时间复杂度O(n)),这看起来不是比二分搜索更加简洁方便嘛?

? ? ? ?参考一些资料↓

? ? ? ? ?在《算法设计技巧与分析》沙特版中对二分搜索算法的时间复杂度分析为O(log n)

? ? ? ? 通过函数来对比一下y=n与y=log n的差别

? ? ? ? 在0<x<=10之间,两个函数之间的函数值差距开始增大

?????????在0<x<=85之间,log n趋于一条直线,而n对应的函数值已经越来越高了

? ? ? ? 由上图可得,当n很大时,线性查找(O(n))所要耗费的时间远远要比二分搜索(O(logn))所耗费的时间要多! 所以二分搜索的重要性是可想而知的,也是必要的!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 13:18:32  更:2021-10-29 13:19:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:31:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码