线性查找
线程查找:暴力查找
/**
* 线性查找
*
* @param arr 要查找的数组
* @param value 要查找的val
* @return 找到值的下标:若为-1代表未找到
*/
public static int seqSearch(int[] arr, int value) {
// 线性查找是逐一比对,发现有相同值,就返回下标
for (int i = 0; i < arr.length; i++) {
if (arr[i] == value) {
return i;
}
}
return -1;
}
二分法查找
二分法查找(折半查找):
前置条件:容器内元素是有序的
思想:将数组分成两半:int mid = (left + right) / 2; ,取数组中间值与目标值 findVal 比较。
如果 mid > findVal ,说明待查找的值在数组左半部分
如果 mid < findVal ,说明待查找的值在数组右半部分
如果 mid == findVal ,运气较好查找到目标值,返回即可
未找到目标值:left > right
/**
* 递归方法
*
* @param array 数组
* @param leftIndex 最左下标
* @param rightIndex 最右下标
* @param findVal 要查找的值
* @return 查到val的下标
*/
public static List<Integer> binarySearch(int[] array, int leftIndex, int rightIndex, int findVal) {
if (leftIndex > rightIndex) {
return null;
}
//中间值下标
int mindIndex = (leftIndex + rightIndex) / 2;
int mindVal = array[mindIndex];
if (findVal > mindVal) {
//要查找的值大于中间值就抛弃左侧值查右边
return binarySearch(array, mindIndex + 1, rightIndex, findVal);
} else if (findVal < mindVal) {
//要查找的值小于中间值就抛弃右侧值查左边
return binarySearch(array, leftIndex, mindIndex - 1, findVal);
} else {
ArrayList<Integer> indexs = new ArrayList<>();
indexs.add(mindIndex);
int goRightIndex = mindIndex + 1;
int goLeftIndex = mindIndex - 1;
//向右循环找到其他相同的值
while (goRightIndex <= rightIndex){
if (array[goRightIndex] == findVal){
indexs.add(goRightIndex);
goRightIndex ++;
}else {
break;
}
}
while (goLeftIndex <= rightIndex){
if (array[goLeftIndex] == findVal){
indexs.add(goLeftIndex);
goLeftIndex-=1;
}else {
break;
}
}
return indexs;
}
}