二分查找法(递归与循环实现)
来源:互联网 发布:网络限速软件 编辑:程序博客网 时间:2024/05/20 11:20
问题:
给定一个排序数组和一个数k,要求找到第一个k的位置和最后一个k的位置
解析:
由于给定的数组是从小到大排序的,故可以按照二分查找法来找,下面分别从递归和循环两种方法来阐述:
//递归方法int GetFirstK(int* data, int length, int k, int start, int end){if (start > end)return -1;int middleindex = (start + end) / 2;int middledata = data[middleindex];if (middledata>k){end = middleindex - 1;}else if (middledata<k){start = middleindex + 1;}else{if (middleindex==0||(middleindex>0&&data[middleindex-1]!=k))//判断左边的元素是否等于k,若等于,说明第一个k在左边,否则第一个k就是middledata{return middleindex;}else{end = middleindex - 1;}}return GetFirstK(data, length, k,start, end);}
//循环法int GetFirstK(int* data, int length, int k){int start = 0;int end = length - 1;while (start<=end){int middleindex = (start + end) / 2;int middledata = data[middleindex];if (middledata<k){start = middleindex + 1;}else if (middleindex>k){end = middleindex - 1;}else{if (middleindex==0||(middleindex>0&&data[middleindex-1]!=k)){return middleindex;}else{end = middleindex - 1;}}}return -1;}
//递归法int GetLastK(int* data, int length, int k, int start, int end){if (start>end){return -1;}int middleindex = (start + end) >> 1;int middledata = data[middleindex];if (middledata<k){start = middleindex + 1;}else if (middledata>k){end = middleindex - 1;}else{if (middleindex==length-1||(middleindex<length-1&&data[middleindex+1]!=k)){return middleindex;}else{start = middleindex + 1;}}return GetLastK(data, length, k, start, end);}
//循环法int GetLastK(int* data, int length, int k){int start = 0;int end = length - 1;while (start<=end){int middleindex = (start + end) >> 1;int middledata = data[middleindex];if (middledata>k){end = middleindex - 1;}else if (middledata<k){start = middleindex + 1;}else{if (middleindex==length-1||(middleindex<length-1&&data[middleindex+1]!=k)){return middleindex;}else{start = middleindex + 1;}}}return -1;}
0 0
- 二分查找法(循环与递归分别实现)
- 二分查找法(递归与循环实现)
- 二分查找法的C语言实现:递归与循环
- 二分查找法(递归+循环)
- 二分查找 递归实现 和 循环实现
- 二分查找法的循环与递归实现及时间复杂度分析
- 算法:两种方式(递归/循环)实现二分查找
- PHP实现二分查找(递归与非递归)
- 二分查找(递归与非递归实现)
- 二分查找算法(递归与非递归实现)
- PHP实现二分查找(递归与非递归)
- 二分查找递归与非递归实现
- 二分查找,递归与非递归实现
- 二分查找非递归与递归实现
- 二分查找递归与非递归实现
- 二分查找(递归实现)
- 二分查找法(递归和非递归实现)
- 二分查找法(递归与非递归方式)
- 创建ATL工程及使用MFC测试COM组件
- 正则表达式
- Android端OCR技术在身份证识别中的应用
- 表格进行多选编辑时,如何让一部分cell支持勾选,一部分不支持
- http反向代理之haproxy详解
- 二分查找法(递归与循环实现)
- 字符串深入学习
- 关于Fragment 使用重叠问题。
- android新组件RecyclerView使用介绍和进阶使用,替用Gallery
- 即时通信
- 两种代理的区别
- Spring AOP实现原理
- 在状态栏加进度条方式
- 模板的模板参数匹配报错问题