二分查找那点事儿
来源:互联网 发布:淘宝折叠雨伞 编辑:程序博客网 时间:2024/05/20 22:00
二分查找你针对有序序列而言的一种查找算法,关于二分查找有一下的几类问题:
1. 给定一个有序(不降序)数组arr,求任意一个i使得arr[i]等于v,不存在则返回-1
2.给定一个有序(不降序)数组arr,求最小的i使得arr[i]等于v,不存在则返回-1
3.给定一个有序(不降序)数组arr,求最大的i使得arr[i]等于v,不存在则返回-1
4.给定一个有序(不降序)数组arr,求最大的i使得arr[i]小于v,不存在则返回-1
5.给定一个有序(不降序)数组arr,求最小的i使得arr[i]大于v,不存在则返回-1
注意的是:
1,在求二分查找的中间点时没有使用
midIndex = (minIndex + maxIndex) / 2
是因为,以免 minIndex + maxIndex之后会导致溢出而出现错误。
2,注意循环的循环终止条件及边界元素的判定
#include <stdlib.h>#include <string.h>#include <stdio.h>/*//给定一个有序(不降序)数组arr,求最大的i使得arr[i]等于v,不存在则返回-1int bisearch(char arr[][10], int begin, int end, char *v){ int minIndex = begin; int maxIndex = end; int midIndex; while(minIndex < maxIndex - 1) { midIndex = minIndex + (maxIndex - minIndex) / 2; if(strcmp(arr[midIndex], v) <= 0) minIndex = midIndex; else maxIndex = midIndex; } if(!strcmp(arr[maxIndex], v)) return maxIndex; else if(!strcmp(arr[minIndex], v)) return minIndex; else return -1;}*//*//一个有序(不降序)数组arr,求任意一个i使得arr[i]等于v,不存在则返回-1int bisearch(char (*arr)[10], int begin, int end, char *v){ int minIndex = begin; int maxIndex = end; int midIndex; while(minIndex < maxIndex) { midIndex = minIndex + (maxIndex - minIndex) / 2; if(strcmp(*(arr + midIndex), v) < 0) minIndex = midIndex + 1; else if(strcmp(*(arr + midIndex), v) > 0) maxIndex = midIndex - 1; else return midIndex; } if(!strcmp(*(arr + minIndex), v)) return minIndex; return -1;}*//*//给定一个有序(不降序)数组arr,求最小的i使得arr[i]等于v,不存在则返回-1int bisearch(char (*arr)[10], int begin, int end, char *v){ int minIndex = begin; int maxIndex = end; int midIndex; while(minIndex < maxIndex - 1) { midIndex = minIndex + (maxIndex - minIndex) / 2; if(strcmp(*(arr + midIndex), v) < 0) minIndex = midIndex; else maxIndex = midIndex; } if(!strcmp(*(arr + minIndex), v)) return minIndex; else if(!strcmp(*(arr + maxIndex), v)) return maxIndex; else return -1;}*//*//给定一个有序(不降序)数组arr,求最大的i使得arr[i]小于v,不存在则返回-1int bisearch(char (*arr)[10], int begin, int end, char *v){ int minIndex = begin; int maxIndex = end; int midIndex; while(minIndex < maxIndex - 1) { midIndex = minIndex + (maxIndex - minIndex) / 2; if(strcmp(*(arr + midIndex), v) < 0) minIndex = midIndex; else maxIndex = midIndex; } if(strcmp(*(arr + maxIndex), v) < 0) return maxIndex; else if(strcmp(*(arr + minIndex), v) < 0) return minIndex; else return -1;}*///给定一个有序(不降序)数组arr,求最小的i使得arr[i]大于v,不存在则返回-1int bisearch(char (*arr)[10], int begin, int end, char *v){ int minIndex = begin; int maxIndex = end; int midIndex; while(minIndex < maxIndex - 1) { midIndex = minIndex + (maxIndex - minIndex) / 2; if(strcmp(*(arr + midIndex), v) <= 0) minIndex = midIndex; else maxIndex = midIndex; } //从小数开始判断 if(strcmp(*(arr + minIndex), v) > 0) return minIndex; else if(strcmp(*(arr + maxIndex), v) > 0) return maxIndex; else return -1;}int main(){ char a[][10] = {"abc", "bcd", "bddaaa", "ddcd", "ddd", "ddd", "ddd", "ddd", "xxx", "xxx"}; char v[] = "zzz"; int last = sizeof(a) / (sizeof(char) * 10); int index = bisearch(a, 0, last-1, v); printf("index of v is %d\n", index); return 0;}
- 二分查找那点事儿
- 程序员那点事儿
- XML那点事儿
- 喝酒那点事儿
- P2P那点事儿
- 招聘那点事儿
- 性能那点事儿
- CMD那点事儿
- 面试那点事儿
- AOP 那点事儿
- 【中差评也就那点事儿】
- 系统维护那点事儿
- Proxy 那点事儿
- ContentProvider 那点事儿
- Lock 那点事儿
- ThreadLocal 那点事儿
- 结婚那点事儿
- Maven 那点事儿
- Linux sort命令解析
- EAS BOS 编辑界面代码关闭窗口后,列表没有刷新,关闭时写下面代码可解决
- 从头学Android之Service初步二
- 有趣的问题
- C++第10周项目5参考——贪财的富翁
- 二分查找那点事儿
- 九、数据库的修改
- 最大公约数与最小公倍数
- EAS BOS 单据列表屏蔽QUERY取数
- C++实现装饰者模式
- C# 控制台求圆的面积和周长
- 怎样在VS2010中使用OpenCV2.4.3
- UI - 多页滑动控件
- MySQL性能优化的最佳20+条经验