算法之二分查找(进阶版 java/c++)

来源:互联网 发布:linux 卸载 工具 编辑:程序博客网 时间:2024/06/11 08:18

java版(非递归和·递归的方法返回查找到的第一个或最后一个相同元素值索引

import edu.princeton.cs.algs4.StdOut;public class Main {    // 非递归版 返回第一个相同值索引    public static int BSearch_F(int key,int[] a)    {        int lo = 0;        int hi = a.length - 1;        while (lo < hi)        {            int mid = lo + (hi - lo) / 2;            if (key <= a[mid])                hi = mid;            else                lo = mid + 1;        }        if (a[lo] == key)            return lo;        return -1;    }    // 非递归版  返回最后一个相同值索引    public static int BSearch_L(int key,int[] a)    {        int lo = 0;        int hi = a.length - 1;        while (lo + 1 < hi)        {            int mid = lo + (hi - lo) / 2;            if (key >= a[mid])                lo = mid;            else                hi = mid - 1;        }        if (a[hi] == key)            return hi;        else if (a[lo] == key)            return lo;        return -1;    }    //递归版 返回第一个相同值索引    public static int rank_F(int key,int[] a)    {        return rank_F(0,a.length - 1,key,a);    }    public static int rank_F(int lo,int hi,int key,int[] a)    {        int mid = lo + (hi - lo) / 2;        if (lo < hi)        {                if (key > a[mid])                    return rank_F(mid + 1,hi,key,a);                else                    return rank_F(lo,mid,key,a);        }        else if (a[lo] == key)            return lo;        else            return -1;    }    // 递归版  返回最后一个相同值索引    public static int rank_L(int key,int[] a)    {        return rank_L(0,a.length,key,a);    }    public static int rank_L(int lo,int hi,int key,int[] a)    {        if (lo + 1 < hi)        {            int mid = lo + (hi - lo) / 2;            if (key >= a[mid])                return rank_L(mid,hi,key,a);            else                return rank_L(lo,mid - 1,key,a);        }        else if (a[hi] == key)            return hi;        else if (a[lo] == key)            return lo;        else            return -1;    }    public static void main(String[] args)    {        int[] a = {1,2,3,4,4,4,5,6,7,8,9};        StdOut.println("非递归版二分查找第一个相同值索引 " + BSearch_F(4,a));        StdOut.println("非递归版二分查找最后一个相同值索引 " + BSearch_L(4,a));        StdOut.println("递归版二分查找第一个相同值索引 " + rank_F(4,a));        StdOut.println("递归版二分查找最后一个相同值索引 " + rank_L(4,a));    }}

运行:

这里写图片描述

c++版:

#include <iostream>using namespace std;// 非递归版 返回第一个相同值索引int BSearch_F(int key, int a[], int size){    int lo = 0;    int hi = size - 1;    while (lo < hi)    {        int mid = lo + (hi - lo) / 2;        if (key <= a[mid])            hi = mid;        else            lo = mid + 1;    }    if (a[lo] == key)        return lo;    return -1;}// 非递归版  返回最后一个相同值索引int BSearch_L(int key, int a[], int size){    int lo = 0;    int hi = size - 1;    while (lo + 1 < hi)    {        int mid = lo + (hi - lo) / 2;        if (key < a[mid])            hi = mid - 1;        else            lo = mid;    }    if (a[hi] == key)        return hi;    else if (a[lo] == key)        return lo;    else        return -1;}//递归版 返回第一个相同值索引int BSRecursion_F(int lo, int hi, int key, int a[]){    if (lo < hi)    {        int mid = lo + (hi - lo) / 2;        if (key <= a[mid])            return BSRecursion_F(lo, mid, key, a);        else            return BSRecursion_F(mid + 1, hi, key, a);    }    if (a[lo] == key)        return lo;    else        return -1;}int BSRecursion_F(int key,int a[],int size){    return BSRecursion_F(0, size - 1,key, a);}// 递归版  返回最后一个相同值索引int BSRecursion_L(int lo, int hi, int key, int a[]){    if (lo + 1 < hi)    {        int mid = lo + (hi - lo) / 2;        if (key < a[mid])            return BSRecursion_L(lo, mid - 1, key, a);        else            return BSRecursion_L(mid, hi, key, a);    }    else if (a[hi] == key)        return hi;    else if (a[lo] == key)        return lo;    else        return 0;}int BSRecursion_L(int key, int a[], int size){    return BSRecursion_L(0, size - 1, key, a);}int main(){    int a[10] = { 0,1,2,4,4,4,4,7,8,9 };    cout <<"非递归查找第一个元素索引 " <<  BSearch_F(4, a, 10) << endl;    cout << "非递归查找最后一个元素索引 " << BSearch_L(4, a, 10) << endl;    cout << "递归查找第一个元素索引 " << BSRecursion_F(4, a, 10) << endl;    cout << "递归查找最后一个元素索引 " << BSRecursion_L(4, a, 10) << endl;    system("pause");    return 0;}

这里写图片描述

原创粉丝点击