算法--二分查找--查找给定条件的值
发布日期:2021-07-01 03:39:37
浏览次数:2
分类:技术文章
本文共 6835 字,大约阅读时间需要 22 分钟。
文章目录
1.数据有序且无重复,查找给定值
/** * @description: 数据有序(小到大)且无重复,查找给定值 * @author: michael ming * @date: 2019/4/16 18:54 * @modified by: */#include#define N 10using namespace std;int binarySearch_simple(int *arr,size_t n,int num){ size_t low = 0, high = n-1; while(low <= high) { size_t mid = low+(high-low)/2; if(arr[mid]==num) return mid; else if(arr[mid] < num) low = mid+1; else high = mid-1; } return -1;}int main(){ cout << "数组打印如下:" << endl; int arr[N] = { 1,2,3,4,5,6,7,8,9,10}; for(int i = 0; i < N; ++i) cout << arr[i] << " "; cout << "请输入要查找的数,将返回下标,不存在返回-1:"; int num; cin >> num; cout << num << " 的下标是:" << binarySearch_simple(arr,N,num) << endl;}
2.数据有序且有重复,查找第1个给定的值
/** * @description: 查找第一个等于给定值的元素 * @author: michael ming * @date: 2019/4/16 19:19 * @modified by: */#include#define N 10using namespace std;int binarySearch_simple(int *arr,size_t n,int num){ size_t low = 0, high = n-1; while(low <= high) { size_t mid = low+(high-low)/2; if(arr[mid]==num) { if(mid == 0 || arr[mid-1] != num) //第一个元素,或者前一个元素不等于num return mid; else //否则,要查找的元素在前面 high = mid-1; } else if(arr[mid] < num) low = mid+1; else high = mid-1; } return -1;}int main(){ cout << "数组打印如下:" << endl; int arr[N] = { 1,1,2,2,4,5,6,7,8,9}; for(int i = 0; i < N; ++i) cout << arr[i] << " "; cout << "请输入1个数,将返回查找第一个等于给定值的元素的下标,不存在返回-1:"; int num; cin >> num; cout << num << " 的下标是:" << binarySearch_simple(arr,N,num) << endl;}
3.查找最后一个值等于给定值的元素
/** * @description: 查找最后一个值等于给定值的元素 * @author: michael ming * @date: 2019/4/16 20:24 * @modified by: */#include#define N 10using namespace std;int binarySearch_simple(int *arr,size_t n,int num){ size_t low = 0, high = n-1; while(low <= high) { size_t mid = low+(high-low)/2; if(arr[mid]==num) { if(mid == n-1 || arr[mid+1] != num) //最后一个元素了,或者后面的不等于num return mid; else //否则最后一个元素还在后面 low = mid+1; } else if(arr[mid] < num) low = mid+1; else high = mid-1; } return -1;}int main(){ cout << "数组打印如下:" << endl; int arr[N] = { 1,1,2,2,4,5,6,8,8,9}; for(int i = 0; i < N; ++i) cout << arr[i] << " "; cout << "请输入要查找的数,将返回最后一个符合的下标,不存在返回-1:"; int num; cin >> num; cout << num << " 的下标是:" << binarySearch_simple(arr,N,num) << endl;}
4.查找第一个大于等于给定值的元素
/** * @description: 查找第一个大于等于给定值的元素 * @author: michael ming * @date: 2019/4/16 20:54 * @modified by: */#include#define N 10using namespace std;int binarySearch_simple(int *arr,size_t n,int num){ size_t low = 0, high = n-1; while(low <= high) { size_t mid = low+(high-low)/2; if(arr[mid] >= num) //当找到要求的值时 { if(mid == 0 || arr[mid-1] < num) //判断是第一个元素,或者前面的比我小 return mid; //当前满足 else //否则满足要求的还在前面 high = mid-1; } else if(arr[mid] < num) low = mid+1; } return -1;}int main(){ cout << "数组打印如下:" << endl; int arr[N] = { 1,2,2,4,5,6,7,8,9,10}; for(int i = 0; i < N; ++i) cout << arr[i] << " "; cout << "请输入一个数,将返回第一个大于等于它的下标,不存在返回-1:"; int num; cin >> num; cout << num << " 的下标是:" << binarySearch_simple(arr,N,num) << endl;}
5.查找最后一个小于等于给定值的元素
/** * @description: 查找最后一个小于等于给定值的元素 * @author: michael ming * @date: 2019/4/16 23:09 * @modified by: */#include#define N 10using namespace std;int binarySearch_simple(int *arr,size_t n,int num){ size_t low = 0, high = n-1; while(low <= high) { size_t mid = low+(high-low)/2; if(arr[mid] > num) high = mid-1; else if(arr[mid] <= num) { if(mid == n-1 || arr[mid+1] > num) //最后一个元素,或者后面的比它大了 return mid; //它是最后一个小于等于的 else low = mid+1; //否则后面还有满足的,下限往上加 } } return -1;}int main(){ cout << "数组打印如下:" << endl; int arr[N] = { 1,2,2,4,5,6,7,10,10,10}; for(int i = 0; i < N; ++i) cout << arr[i] << " "; cout << "请输入一个数,返回最后一个小于等于给定值的元素的下标,不存在返回-1:"; int num; cin >> num; cout << num << " 的下标是:" << binarySearch_simple(arr,N,num) << endl;}
6.查找IP归属(利用上面#5代码)
/** * @description: 查找ip地址归属,找到最后一个区间开始地址<=ip的 * @author: michael ming * @date: 2019/4/16 23:38 * @modified by: */#include#include "binarySearch_findLastLessNum.cpp"int main(){ int start[5] = { 101,201,301,401,501}; //假设为ip起始地址(A,B,C,D,E) int end[5] = { 200,300,400,500,600}; //对应ip终止地址 size_t ip; while(1) { std::cout << "请输入要查询的ip: "; std::cin >> ip; int index = binarySearch_simple(start,5,ip); //在ip区间头里查找最后一个<=我的 if(index != -1 && ip <= end[index]) switch(index) { case 0: std::cout << "ip in city A"<< std::endl; break; case 1: std::cout << "ip in city B"<< std::endl; break; case 2: std::cout << "ip in city C"<< std::endl; break; case 3: std::cout << "ip in city D"<< std::endl; break; case 4: std::cout << "ip in city E"<< std::endl; break; } else std::cout << "ip not found!" << std::endl; }}
7.循环有序数组,查找给定值
例如:4,5,6,7,1,2,3
循环数组性质:以数组中间点为分区,数组分成一个有序数组和一个循环有序数组。如果首元素 arr[low] < arr[mid],左半部分:有序,右半部分:循环有序;
如果首元素 arr[low] > arr[mid],右半部分:有序,左半部分:循环有序; 判断查找的数是否在有序的半边范围内,更新上下限 时间复杂度为 O(logN)。/** * @description: 循环有序数组,查找给定值 * @author: michael ming * @date: 2019/4/17 0:25 * @modified by: */#include#define N 10int circular_Arr_BS(int *arr, size_t n, int num){ size_t low = 0, high = n-1; while(low <= high) { size_t mid = low+(high-low)/2; if(arr[mid] == num) return mid; if(arr[mid] < arr[low]) //转折点在左边,右边有序 { if(arr[mid] <= num && num <= arr[high]) //数据在右边 low = mid+1; else high = mid-1; } else //转折点在右边,左边有序 { if(arr[low] <= num && num < arr[mid]) //数据在左边 high = mid-1; else low = mid+1; } } return -1;}int main(){ int arr[N] = { 4,5,6,7,8,9,10,1,2,3}; size_t mid = (N-1)/2; int num; std::cin >> num; std::cout << circular_Arr_BS(arr,N,num); return 0;}
转载地址:https://michael.blog.csdn.net/article/details/89339488 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月11日 21时36分13秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[转帖]Robots.txt指南
2019-05-01
正则表达式简介(微软)--6.优先权顺序
2019-05-01
多用户与多租户的区别
2019-05-01
Python自动化运维 - day14 - JavaScript基础
2019-05-02
oracle保存小数点前为"0"的问题
2019-05-02
linux sar 命令详解
2019-05-02
ipvsadm 安装配置
2019-05-02
Linux shell脚本的字符串截取
2019-05-02
数据库复习(4)
2019-05-02
1小时点击量破千万!阿里巴巴首发:MySQL高级调优笔记!全是技术重点
2019-05-02
这个GItHub上的Java项目开源了 2021最全的Java架构面试复习指南
2019-05-02
Proftpd MySQL [Step by Step]
2019-05-02
EFI Shell 命令参考
2019-05-02
HP-UX oracle RAC 双机实践
2019-05-02
解决SHELL脚本中的export无法生效的问题【转】
2019-05-02
linux中的sh脚本语法【转】
2019-05-02
区别数据结构中的堆栈与内存中的堆栈的个人总结【转】
2019-05-02
c++中冒号(:)和双冒号(::)的用法【转】
2019-05-02