你真的会写二分查找吗?

来源:互联网 发布:下载无人机航拍软件, 编辑:程序博客网 时间:2024/06/10 03:04

二分查找

/** * 二分查找,找到该值在数组中的下标,否则为-1 */static int binarySerach(int[] array, int key) {    int left = 0;    int right = array.length - 1;    // 这里必须是 <=    while (left <= right) {        int mid = (left + right) / 2;        if (array[mid] == key) {            return mid;        }        else if (array[mid] < key) {            left = mid + 1;        }        else {            right = mid - 1;        }    }    return -1;}

每次移动left和right指针的时候,需要在mid的基础上+1或者-1, 防止出现死循环, 程序也就能够正确的运行。

  注意:代码中的判断条件必须是while (left <= right),否则的话判断条件不完整,比如:array[3] = {1, 3, 5};待查找的键为5,此时在(low < high)条件下就会找不到,因为low和high相等时,指向元素5,但是此时条件不成立,没有进入while()中。

例题
给定一个已经排好序的字符串数组,空字符串散布在该数组中,编写一个函数寻找一个 给定字符串的位置。
思路:既然有序,一定是二分查找。当遇到空字符时,mid+1,一直到mid不为空字符。

#include<iostream>using namespace std;int search(string s[],int low,int high,string x) {    if(x == "")    return -1;    while(low <= high) {        int mid = (high-low)/2+low;        int t = mid;        while(s[t] == "" && t<=high) {            t++;        }        if(s[t] == x)                return t;            else if(s[t] < x)                low = t+1;            else                high = mid-1;    }    return -1;}int main() {    string s[13] = {        "at", "", "", "", "ball", "", "", "car", "", "", "dad", "", ""    };    cout<<search(s, 0, 12, "ball")<<endl;    return 0;}
原创粉丝点击