二分查找法(递归与循环实现)

来源:互联网 发布:网络限速软件 编辑:程序博客网 时间: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
原创粉丝点击