面試算法知識梳理(8) - 二分查找算法及其變型

面試算法代碼知識梳理系列

面試算法知識梳理(1) - 排序算法
面試算法知識梳理(2) - 字符串算法第一部分
面試算法知識梳理(3) - 字符串算法第二部分
面試算法知識梳理(4) - 數(shù)組第一部分
面試算法知識梳理(5) - 數(shù)組第二部分
面試算法知識梳理(6) - 數(shù)組第三部分
面試算法知識梳理(7) - 數(shù)組第四部分
面試算法知識梳理(8) - 二分查找算法及其變型
面試算法知識梳理(9) - 鏈表算法第一部分
面試算法知識梳理(10) - 二叉查找樹
面試算法知識梳理(11) - 二叉樹算法第一部分
面試算法知識梳理(12) - 二叉樹算法第二部分
面試算法知識梳理(13) - 二叉樹算法第三部分


一、概要

本文介紹了有關(guān)二分查找的算法的Java代碼實(shí)現(xiàn),所有代碼均可通過 在線編譯器 直接運(yùn)行,算法目錄:

  • 普通二分查找
  • 查找關(guān)鍵字第一次出現(xiàn)的位置
  • 查找關(guān)鍵字最后一次出現(xiàn)的位置
  • 查找小于關(guān)鍵字的最大數(shù)字出現(xiàn)的位置
  • 查找大于關(guān)鍵字的最小數(shù)字出現(xiàn)的位置

對于二分查找,有以下幾個需要注意的點(diǎn):

  • pStartpEnd修改的條件進(jìn)行合并.
  • 如果出現(xiàn)了pEnd=pMid的情況要將while條件修改為pStart<pEnd
  • 如果出現(xiàn)了pStart=pMid的情況要將while條件修改為pStart<pEnd-1
  • 對于pStart<pEnd的結(jié)束條件,最后一次進(jìn)入循環(huán)的數(shù)組長度為2,結(jié)束時數(shù)組長度為1
  • 對于pStart<pEnd-1的結(jié)束條件,最后一次進(jìn)入循環(huán)的數(shù)組長度為3,結(jié)束時數(shù)組長度為12

二、代碼實(shí)現(xiàn)

2.1 普通二分查找

實(shí)現(xiàn)代碼

class Untitled {
    
    static int binNormalSearch(int p[], int len, int key) {
        int start = 0;
        int end = len-1;
        while (start <= end) {
            int mid = (start+end) >> 1;
            if (p[mid] > key) {
                end = mid-1;
            } else if (p[mid] < key) {
                start = mid+1;
            } else {
                return mid;
            }
        }
        return -1;
    }
    
    public static void main(String[] args) {
        int p[] = {1, 5, 6, 7, 11, 11, 56};
        System.out.println("index=" + binNormalSearch(p, p.length, 11));
    }
}

2.2 查找關(guān)鍵字第一次出現(xiàn)的位置

實(shí)現(xiàn)代碼

class Untitled {

    static int binFirstKSearch(int p[], int len, int key) {
        int start = 0;
        int end = len-1;
        while (start < end) {
            int mid = (start+end) >> 1;
            if (p[mid] > key) {
                end = mid-1;
            } else if (p[mid] < key) {
                start = mid+1;
            } else {
                end = mid;
            }
        }
        if (p[start] == key) {
            return start;
        }
        return -1;
    }

    public static void main(String[] args) {
        int p[] = {1, 5, 6, 7, 11, 11, 11, 11, 56};
        System.out.println("index=" + binFirstKSearch(p, p.length, 11));
    }
}

2.3 查找關(guān)鍵字最后一次出現(xiàn)的位置

實(shí)現(xiàn)代碼

class Untitled {

    static int binLastKSearch(int p[], int len, int key) {
        int start = 0;
        int end = len-1;
        while (start < end-1) {
            int mid = (start+end) >> 1;
            if (p[mid] > key) {
                end = mid-1;
            } else if (p[mid] < key) {
                start = mid+1;
            } else {
                start = mid;
            }
        }
        if (p[end] == key) {
            return end;
        }
        if (p[start] == key) {
            return start;
        }
        return -1;
    }

    public static void main(String[] args) {
        int p[] = {1, 5, 6, 7, 11, 11, 11, 11, 56};
        System.out.println("index=" + binLastKSearch(p, p.length, 11));
    }
}

2.4 查找小于關(guān)鍵字的最大數(shù)字出現(xiàn)的位置

代碼實(shí)現(xiàn)

class Untitled {

    static int binMaxLessKSearch(int p[], int len, int key) {
        int start = 0;
        int end = len-1;
        while (start < end-1) {
            int mid = (start+end) >> 1;
            if (p[mid] > key) {
                end = mid-1;
            } else if (p[mid] < key) {
                start = mid;
            } else {
                end = mid-1;
            }
        }
        if (p[end] < key) {
            return end;
        }
        if (p[start] < key) {
            return start;
        }
        return -1;
    }

    public static void main(String[] args) {
        int p[] = {1, 5, 6, 7, 11, 11, 11, 11, 56};
        System.out.println("index=" + binMaxLessKSearch(p, p.length, 11));
    }
}

2.5 查找大于關(guān)鍵字的最小數(shù)字出現(xiàn)的位置

代碼實(shí)現(xiàn)

class Untitled {

    static int binMinMoreKSearch(int p[], int len, int key) {
        int start = 0;
        int end = len-1;
        while (start < end) {
            int mid = (start+end) >> 1;
            if (p[mid] > key) {
                end = mid;
            } else if (p[mid] < key) {
                start = mid+1;
            } else {
                start = mid+1;
            }
        }
        if (p[start] > key) {
            return start;
        }
        return -1;
    }

    public static void main(String[] args) {
        int p[] = {1, 5, 6, 7, 11, 11, 11, 11, 56};
        System.out.println("index=" + binMinMoreKSearch(p, p.length, 11));
    }
}

更多文章,歡迎訪問我的 Android 知識梳理系列:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容