顺序查找&二分查找
1.顺序查找
代码如下(示例):
package Search.SqueezeSearch;
import java.util.ArrayList;
//顺序查找出所有与值相等的索引下标
public class SequeezeSearch {
public static void main(String[] args) {
int[] array = {
-1,2,10,12,3,6,3};
ArrayList<Integer> arrayList = SequeezeSearch(array, 3);
System.out.println(arrayList);
}
/**
*
* @param array 传入的数组
* @param value 查找的数值
* @return 如果查找不到,则返回null,如果查找到了则返回索引集合
*/
public static ArrayList<Integer> SequeezeSearch(int[] array, int value){
ArrayList<Integer> arrayList = new ArrayList<>();
for(int i = 0;i<array.length;i++){
if (array[i]==value){
arrayList.add(i);
}
}
return arrayList;
}
}
2.二分查找
代码如下(示例):
package Search.BinarySearch;
import java.util.ArrayList;
//对一个有序数组进行二分查找
//查找所有与value相等的索引
public class BinarySearch {
public static void main(String[] args) {
int[] array = {
1, 8, 10, 89, 89, 1000, 1234};
ArrayList<Integer> arrayList = BinarySearch(array, 0, array.length - 1, 89);
System.out.println(arrayList);
}
/**
* @param array 传入的数组
* @param left 数组初始索引
* @param right 数组末尾索引
* @param value 给定寻找的值
* @return 范围索引集合
*/
public static ArrayList<Integer> BinarySearch(int[] array, int left, int right, int value) {
int mid = (left + right) / 2;
ArrayList<Integer> arrayList = new ArrayList<>();
if (left > right || array[mid] < array[0] || array[mid] > array[array.length - 1]) {
return arrayList;
}
if (array[mid] < value) {
return BinarySearch(array, mid + 1, right, value);
} else if (array[mid] > value) {
return BinarySearch(array, left, mid - 1, value);
} else {
arrayList.add(mid);
int temp = mid - 1;
while (true) {
//因为数组是有序的,如果相等,肯定在左右侧,先找左侧
if (temp < 0 || array[temp] != value) {
break;
}
arrayList.add(temp);
temp--;
}
temp = mid + 1;
while (true) {
//因为数组是有序的,如果相等,肯定在左右侧,先找左侧
if (temp > array.length - 1 || array[temp] != value) {
break;
}
arrayList.add(temp);
temp++;
}
return arrayList;
}
}
}
前提:二分查找必须是一个有序数组!
总结
思路很简单