线性查找
线程查找:暴力查找
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
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;
}
}
|