/** * 二分查找,等于某个值的位置,非递归 * @param data */ public static int binarySearch1(int[] data,int val){ if(data == null || data.length ==0){ return -1; } int low = 0; int high = data.length; while (low <= high){ int midden = low+((high - low)>>1); if(data[midden]>val){ high = midden -1; }else if(data[midden]<val){ low = midden + 1; }else { return midden; } } return -1; } /** * 递归实现二分查找 * @param data * @param low * @param high * @param val * @return */ public static int searchInternally(int[] data,int low,int high,int val){ if(low > high) return -1; int midden = low +((high-low)>>1); if(data[midden]>val){ return searchInternally(data,low,midden - 1,val); }else if(data[midden]<val){ return searchInternally(data,midden + 1,high,val); }else { return midden; } } /** * 查找第一个值等于给定值的元素 * @param data * @param val * @return */ public static int searchFirstVal(int[] data,int val){ int low= 0; int high = data.length; while (low<=high){ int midden = low + ((high - low)>>1); if(data[midden]>val){ high = midden -1; }else if(data[midden]<val){ low = midden + 1; }else { if(midden == 0 || data[midden - 1] != val) return midden; high = midden - 1; } } return -1; } /** * 查找某个值出现的最后一个位置 * @param data * @param val * @return */ public static int searchLastVal(int[] data,int val){ int low = 0; int high = data.length-1; while (low <= high){ int midden = low + ((high - low)>>1); if(data[midden]>val){ high = midden - 1; }else if(data[midden]<val){ low = midden +1; }else { if(midden == high || data[midden+1] != val) return midden; low = midden + 1; } } return -1; } /** * 判断数组中大于等于一个值 * @param data * @param val * @return */ public static int searchGtEVal(int[] data,int val){ int low =0; int high = data.length-1; while (low <= high){ int midden = low +((high - low)>>1); if(data[midden]>=val){ if(midden == 0 || data[midden - 1]<val) return midden; else high = midden - 1; }else { low = midden + 1; } } return -1; } /** * 查找最后一个小于等于给定值的元素 * @param data * @param val * @return */ public static int searchLtEVal(int[] data,int val){ int low = 0; int high = data.length-1; while (low <= high){ int midden = low +((high - low)>>1); if(data[midden]<= val){ if(midden == high || data[midden+1]>val)return midden; }else { high = midden - 1; } } return -1; } public static void main(String[] args) { int[] data = {1,2,3,4,5,6,7,8,9}; int val = 4; int position = binarySearch1(data,val); System.out.println(val+" 的位置为:"+position); System.out.println(val+" 的位置为:"+searchInternally(data,0,data.length,val)); int[] data2 = {1,2,3,4,5,5,5,6}; val = 5; System.out.println("第一个 "+val+" 出现的位置为:"+searchFirstVal(data2,val)); System.out.println("最后一个 "+val+" 出现的位置为:"+searchLastVal(data2,val)); int[] data3 = {1,2,3,4,6,7}; val = 5; System.out.println("第一个大于或等于 "+val+" 出现的位置为:"+searchGtEVal(data3,val)); val = 7; System.out.println("最后一个小于或等于 "+val+" 出现的位置为:"+searchGtEVal(data3,val)); }
二分查找和变形问题
最新推荐文章于 2022-05-18 16:02:07 发布