二分查找法(递归与循环实现)
2015-09-06 17:39
357 查看
问题:
给定一个排序数组和一个数k,要求找到第一个k的位置和最后一个k的位置
解析:
由于给定的数组是从小到大排序的,故可以按照二分查找法来找,下面分别从递归和循环两种方法来阐述:
给定一个排序数组和一个数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; }
相关文章推荐
- Android:自定义滚动边缘(EdgeEffect)效果
- 响应式布局通用
- thinkphp自定义函数
- iOS断点下载的小问题
- Android 基于Message的进程间通信 Messenger完全解析
- fork函数总结
- 关于Function.prototype.apply.call的一些补充
- 颜色模式
- Android开发实践:使用Service还是Thread
- Android开发实践:使用Service还是Thread
- Hdoj1206,Ignatius and the Princess I
- 技术文档--持续更新
- htop
- SpringMVC定时任务--Quartz定时任务框架介绍和Cron表达式详解
- Android源码分析-点击事件派发机制
- STL map的使用(一)
- Linux文件系统及磁盘管理
- 两种代理的区别
- ZOJ 2873 Smart Sister
- QR码长度问题以及生成原理和编码方式