Java 算法——二分查找数组集合关键元素

java

package com.sinosoft;

import java.util.*;

import java.util.stream.Stream;

/**

* @author Created by xushuyi

* @Description

* @date 2019/1/17 10:41

*/

public class ArrayTest {

public static void main(String[] args) {

/**

* 1. 遍历一个数组 获取最大值

* 2. 采用二分法

*/

getArrayMaxVal();

}

/**

* 1. 遍历一个数组 获取最大值

* 2. 采用二分法,前提必须是连续(升序/降序)数组,前提没有重复元素

*/

private static void getArrayMaxVal() {

// 定义一个list数组集合

List<Integer> list = new ArrayList<>(100);

addListVal(list);

System.out.println("集合:" + list);

// 默认是 按照升序排列

// Collections.sort(list);

// 数组反转

// Collections.reverse(list);

// 通过比较策略 来按照升序/降序排列

Collections.sort(list, new Comparator<Integer>() {

@Override

public int compare(Integer o1, Integer o2) {

return o1 - o2; // 升序 如果 o1 小于 o2 返回 -1, 相等返回 0 ,o1 大于 o2 返回 1

// return o2 - o1; // 降序 如果 o1 小于 o2 返回 1, 相等返回 0 ,o1 大于 o2 返回 -1

}

});

System.out.println("排序后:" + list);

// 集合开始位置

int startIndex = 0;

// 集合结束位置

int endIndex = list.size() - 1;

// 定义查找集合中的元素

int key = 2;

// 采用递归的方式进行查找(推荐)

int val = searchList(list, startIndex, endIndex, key);

System.out.println("递归查找结果:" + val);

// 采用非递归的方式进行查找

val = searchList1(list, startIndex, endIndex, key);

System.out.println("非递归查找结果:" + val);

}

/**

* 采用二分法来查找集合中的关键元素

*

* @param list 有序集合

* @param startIndex 集合开始下标

* @param endIndex 集合结束下标

* @param key 查找关键元素

* @return int

*/

private static int searchList1(

List<Integer> list,

int startIndex,

int endIndex,

int key) {

// 满足 开始下标 不大于 结束下标才行

while (startIndex <= endIndex) {

int middleIndex = (endIndex - startIndex) / 2 + startIndex;

if (key == list.get(middleIndex))

return middleIndex;

if (key > list.get(middleIndex))

// 说明在[middle, end]之间,需要重置 开始下标为 中间位置+1,抛弃[start,middle]集合查找

startIndex = middleIndex + 1;

else if (key < list.get(middleIndex))

// 说明在[start, middle]之间,需要重置 结束下标为 中间位置-1,抛弃[middle,end]集合查找

endIndex = middleIndex - 1;

else

// 集合中没有找到指定的元素

return -1;

}

return -1;

}

/**

* 采用二分法查找集合中的关键元素

* 采用递归的方式

*

* @param list 有序集合

* @param startIndex 开始下标

* @param endIndex 结束下标

* @param key 查找关键元素

*/

private static int searchList(

List<Integer> list,

int startIndex,

int endIndex,

int key) {

int middleIndex = (endIndex - startIndex) / 2 + startIndex;

System.out.println("中间位置:" + middleIndex);

if (key == list.get(middleIndex)) {

return middleIndex;

}

if (startIndex >= endIndex) {

return -1;

}

// 说明在 [middle,end]之间

else if (key > list.get(middleIndex)) {

return searchList(list, middleIndex + 1, endIndex, key);

}

// 说明在[start, middle]之间

else if (key < list.get(middleIndex)) {

return searchList(list, startIndex, middleIndex - 1, key);

} else {

return -1;

}

}

/**

* 对list集合进行赋值

*

* @param list 集合

*/

private static void addListVal(List<Integer> list) {

// for (int i = 0; i < 88; i++) {

// list.add(i);

// }

list.add(1);

list.add(2);

list.add(3);

list.add(4);

list.add(7);

list.add(8);

list.add(9);

list.add(10);

list.add(5);

list.add(6);

}

}

以上是 Java 算法——二分查找数组集合关键元素 的全部内容, 来源链接: utcz.com/z/391538.html

回到顶部