本文共 2725 字,大约阅读时间需要 9 分钟。
二分法,顾名思义,就是对其进行折半分别在两边查找。两边再分别进行折半、查找,再折半、再查找,直到找到为止,或者整个数组都找不到这个值,应立即结束查找。
/** * * @param arr 查询的数组 * @param value 查询的值 * @return 查询到的值的索引 */ public static int ef(int arr[], int value) { int left = 0; int right = arr.length - 1; int mid = 0; while (left <= right) { mid = (left + right) >> 1; if (value > arr[mid]) { left = mid + 1; } else if (value < arr[mid]) { right = mid - 1; } else { return mid; } } return -1; }
/** * * @param arr 查询的数组 * @param value 查询的值 * @return 查询到的值的索引 */ public static int ef(int arr[], int value) { int left = 0; int right = arr.length - 1; int mid = 0; while (left <= right) { mid = (left + right) >> 1; if (value > arr[mid]) { left = mid + 1; } else if (value < arr[mid]) { right = mid - 1; } else { return mid; } } return -1; }
相比于二分法的折半,插值就相当于折插值数,至于什么是折插值数,我们需要先了解一下它的公式:
public static int insertValSearch(int arr[],int left,int right,int value) { if(left>right ) { return -1; } System.out.println("aaa"); //自适应:如果是一个连续的有序数组,那么可以自适应,只需要一次能查到 //如果是一个非连续的有序数组,那么只能适应两端,两端之内的值则和二分一样 int mid = left + (right-left)*(value-arr[left])/(arr[right]-arr[left]);// System.out.println(mid);// int mid = left + value - arr[left]; System.out.println(mid); if(value>arr[mid]) { return insertValSearch(arr, mid+1, right, value); }else if(value
越努力,越幸运,The harder you work, the more luck you have.
关注笔笔一起努力吧ヾ(◍°∇°◍)ノ゙!!!
转载地址:http://gcrq.baihongyu.com/