二分查找法(递归与循环实现)
生活随笔
收集整理的這篇文章主要介紹了
二分查找法(递归与循环实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題:
?給定一個排序數組和一個數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; }
總結
以上是生活随笔為你收集整理的二分查找法(递归与循环实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win11 在线安装QT5.15.2教程
- 下一篇: n!后面有多少个0(转载)