/**
* 二分法:每次把数组拆成两份
* 1、查询有序数组中的指定值的位置
* 2、查询有序数组中大于等于某个值的最左侧的位置
* 3、查找局部最小值
* 局部最小:乱序数组中,相邻的数不相等,某个值和它相邻的值比较,如果最小,就是局部最小
*/
public class DichotomyTest {
public static void main(String[] args) {
int[] arr = {1,2,3,4,6,8,11,15,17};
findNum(arr, 3);
int[] arr2 = {1,2,2,2,3,3,3,4,4,4,6,8,11,15,17};
findNum(arr2, 4);
int[] arr3 = {12,6,3,6,12,8,20,23,19,5,100};
findSmall(arr3);
}
/**
* 二分法找有序数组中的某个值的位置
*/
public static void findNum(int[] arr, int num) {
if (arr == null || arr.length == 0) {
return;
}
int start = 0;
int end = arr.length - 1;
int mid = start + ((end - start) >> 2);
while (arr[mid] != num) {
if (arr[mid] < num) {
start = mid;
} else {
end = mid;
}
mid = (start + end)/2;
}
System.out.println(mid);
}
/**
* 二分法找有序数组中满足大于等于某个值的最左侧的位置
*/
public static void findLeftNum(int[] arr, int num) {
if (arr == null || arr.length == 0) {
return;
}
int start = 0;
int end = arr.length - 1;
int mid = (arr.length - 1)/2;
do {
if (arr[mid] < num) {
start = mid;
} else {
end = mid;
}
mid = (start + end) / 2;
} while (mid != start);
System.out.println(mid);
}
/**
* 二分法查找局部最小值
* 局部最小:乱序数组中,相邻的数不相等,某个值和它相邻的值比较,如果最小,就是局部最小
*/
public static void findSmall(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
if (arr.length == 1){
System.out.println(arr[0]);
}
if (arr[0] < arr[1]) {
System.out.println(arr[0]);
}
if (arr[arr.length - 1] < arr[arr.length - 2]) {
System.out.println(arr[arr.length - 1]);
}
int start = 0;
int end = arr.length - 1;
int mid = (arr.length - 1)/2;
while (true) {
if (arr[mid-1] > arr[mid] && arr[mid + 1] > arr[mid]) {
System.out.println(arr[mid]);
return;
} else if (arr[mid - 1] < arr[mid]) {
end = mid;
} else {
start = mid;
}
mid = (start + end)/2;
}
}
}
二分法
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 现在还未考虑好如何定义二分法,先呈上一例。(见《资本论》第一卷page11 前一商品的价值,表现为相对的价值,换言...
- 学习笔记一 深入理解二分法 二分法的使用前提 二分法是进行查找最基础的方法。由于实现方法是使用 left,righ...
- 要进行二分的话肯定需要有序才可以, 如果没有顺序的话就要使他有序, 那我们可以选择排序后再进行二分查找. 有没有更...
- 传播的类型有两种分类方式,一种是二分法,一种是四分法。 二分法二分法可以分为亲身传播和大众传播。 亲身传播是以人体...