当前位置: 首页 > news >正文

二分查找

文章目录

    • 1.算法思想
    • 2.代码实现
      • (1)循环实现
      • (2)递归实现
    • 3.题目练习

1.算法思想

二分查找(折半查找):有序数组(升序或降序,可以不连续),每次缩小一半的区间。
时间复杂度:O(log n)
空间复杂度:循环实现是 O(1),递归实现是 O(log n)



2.代码实现

C语言求数组长度:

int n = sizeof(A)/sizeof(A[0]);

(1)循环实现

1.C语言实现

//binarySearch.c : 二分查找(折半查找):要求数组必须是有序的(升序或降序,可以不连续)
#include <stdio.h>int binarySearch(int A[], int n, int key)
{int left = 0, right = n-1;while(left <= right){int mid = left + (right-left)/2;if(key < A[mid]){        //目标key在左半区间right = mid-1;}else if(key > A[mid]){  //目标key在右半区间left = mid+1;}else{                   //key == midreturn mid;}}return -1;
}int main()
{int A[] = {01,20,27,59,71,3702,10247};  int n = sizeof(A)/sizeof(A[0]);int pos = binarySearch(A,n,10247);printf("pos = %d\n", pos);return 0;
}

2.C++实现

#include <iostream>
#include <vector>
using std::cout;
using std::vector;int binarySearch(const vector<int>& arr, int target)
{int left = 0, right = arr.size()-1;while(left <= right){//mid的声明要放在循环里面int mid = left + (right-left)/2;  //避免整数溢出if(target < arr[mid]){       //目标在左半区间right = mid -1;}else if(target > arr[mid]){ //目标在右半区间left = mid + 1;}else{return mid;}}return -1;
}int main()
{//二分查找要求是有序数组vector<int> arr = {1,3,5,7,9,11,13,15,17,19,21,23};int target = 21;int pos = binarySearch(arr, target);if(pos == -1){cout << "未找到目标值" << target << "\n";}else{cout << "目标值" << target << "的下标为" << pos << "\n";}return 0;
}

(2)递归实现

//二分查找(折半查找):要求数组必须是有序的(升序或降序,可以不连续)#include <stdio.h>//1.循环实现
int binarySearchIterative(int A[], int n, int key)
{int left = 0, right = n-1;while(left <= right){int mid = left + (right-left)/2;if(key < A[mid]){        //目标key在左半区间right = mid-1;}else if(key > A[mid]){  //目标key在右半区间left = mid+1;}else{                   //key == midreturn mid;}}return -1;
}//2.递归实现
int binarySearchRecursive(int A[], int left, int right, int key)
{//递归出口if(left > right)    return -1;//递归公式int mid = left + (right-left)/2;if(key < A[mid]){        //目标在左半区间return binarySearchRecursive(A, left, mid-1, key);}else if(key > A[mid]){  //目标值在右半区间return binarySearchRecursive(A, mid+1, right, key);}else{                   //目标值 == A[mid]return mid;}
}int main()
{int A[] = {1,20,27,59,71,88,100,3702,10247};  int n = sizeof(A)/sizeof(A[0]);while(1){int key;printf("请输入要查找的数字: ");scanf("%d",&key);int posI = binarySearchIterative(A,n,key);int posR = binarySearchRecursive(A,0,n-1,key);printf("posI = %d\n", posI);printf("posR = %d\n", posR);}return 0;
}



3.题目练习

1.力扣704:二分查找
https://leetcode.cn/problems/binary-search/

参考答案:C语言实现

//二分查找的循环实现
int search(int* nums, int numsSize, int target) {int left = 0, right = numsSize-1;while(left <= right){int mid = left + (right-left)/2;if(target < nums[mid]){        //目标在左半区间right = mid-1;}else if(target > nums[mid]){  //目标在右半区间left = mid+1;}else{                         //target == nums[mid]return mid;}}return -1;
}
http://www.lryc.cn/news/455733.html

相关文章:

  • 关注、取关、Redis实现共同关注、 博客推送与分页查询
  • 专业高清录屏软件!Mirillis Action v4.40 解锁版下载,小白看了都会的安装方法
  • 胤娲科技:AI重塑会议——灵动未来,会议新纪元
  • Python画笔案例-080 绘制 颜色亮度测试
  • MATLAB工具库:数据统计分析工具MvCAT、MhAST等
  • 角色动画——RootMotion全解
  • 加密软件的桌面管理系统有什么?
  • 【stm32】寄存器(stm32技术手册下载链接)
  • django的路由分发
  • 《贪吃蛇小游戏 1.0》源码
  • 初入网络学习第一篇
  • (项目管理系列课程)项目规划阶段:项目范围管理-收集需求
  • SQl注入文件上传及sqli-labs第七关less-7
  • 想成为月薪过万的软件测试工程师?快看过来!
  • 找生网站方案———未来之窗行业应用跨平台架构
  • 全网都在找的Python生成器竟然在这里!简单几步,让你的代码更简洁、更高效!
  • 插入排序,希尔排序,和归并排序
  • Prompt 模版解析:诗人角色的创意引导与实践
  • zookeeper选举kafka集群的controller
  • 吉如一线段树:区间最值和历史最值
  • 数据库常见的安全特性有哪些
  • Debezium日常分享系列之:Debezium 3.0.0.Final发布
  • MVCC(多版本并发控制)
  • 低代码可视化-uniapp响应式数据data-代码生成器
  • 10.7学习
  • 基础算法之前缀和--Java实现(下)--LeetCode题解:-和为 K 的子数组 - 和可被 K 整除的子数组 -连续数组-矩阵区域和
  • 序列化与反序列化基础及反序列化漏洞(附案例)
  • Khronos:动态环境下时空度量语义SLAM的统一方法
  • 一个迷茫的25岁前端程序员的自述
  • 多文件并发多线程MD5工具(相对快速的MD5一批文件),适配自定义MD5 Hash I/O缓存。