数据结构与算法-查找-(顺序查找&二分查找)


顺序查找&二分查找

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;
        }
    }
}


前提:二分查找必须是一个有序数组!


总结

思路很简单

猜你喜欢

转载自blog.csdn.net/slighting1128/article/details/111992757
今日推荐