其他分享
首页 > 其他分享> > 线性查找和二分查找

线性查找和二分查找

作者:互联网

线性查找

package com.dai.search;

public class SeqSearch {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = {1, 9, 11, -1, 34, 89};//无序的数组
        int index = seqSearch(arr, 11);
        if(index==-1) {
            System.out.println("没找到");
        }else {
            System.out.println("找到,下标为" + index);
        }
    }
    
    //线性查找,找到一个,就返回下标
    public static int seqSearch(int[] arr, int value) {
        //逐一匹配,发现有相同的值,就返回下标
        for(int i=0;i<arr.length;i++) {
            if(arr[i] == value) {
                return i;
            }
        }
        return -1;
    }

}

二分查找(必须是有序的)

package com.dai.search;

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

public class BinarySearch {

    public static void main(String[] args) {
        int arr[] = {1,8,10,1000,1000,1000,1234};//二分查找的数组是有序的
        ArrayList resIndexList =binarySearch2(arr, 0, arr.length-1, 1000);
        System.out.println("resIndexList=" + resIndexList);
    }
    //二分查找算法
    /*
     * arr:数组
     * left: 左索引
     * right:右索引
     * findVal:找到的下标
     * */
    public static int binarySearch(int[] arr, int left, int right, int findVal) {
        //当left>right,说明递归整个数组都没有找到,直接return
        if(left>right) {
            return -1;
        }
        int mid = (left+right)/2;
        int midVal = arr[mid];
        if(findVal > midVal) {
            return binarySearch(arr, mid+1, right, findVal);
        }else if(findVal < midVal){
            return binarySearch(arr, left, mid-1, findVal);
        }
        else {
            return mid;
        }
    }
    
    //如何找到所有的下标?
    //在找到Mid时,不要马上返回,向Mid左边和右边扫描,将满足条件的下标加入集合
    public static ArrayList binarySearch2(int[] arr, int left, int right, int findVal) {
        //当left>right,说明递归整个数组都没有找到,直接return
        if(left>right){
            return new ArrayList<Integer>();
        }
        int mid = (left+right)/2;
        int midVal = arr[mid];
        if(findVal > midVal) {
            return binarySearch2(arr, mid+1, right, findVal);
        }else if(findVal < midVal){
            return binarySearch2(arr, left, mid-1, findVal);
        }
        else {
            ArrayList<Integer> resIndexList = new ArrayList<Integer>();
            int temp = mid-1;
            while(true) {
                if(temp<0 || arr[temp] != findVal) {
                    break;
                }else {
                    resIndexList.add(temp);
                    temp -= 1;
                }
            }
            resIndexList.add(mid);
            temp = mid+1;
            while(true) {
                if(temp>arr.length-1 || arr[temp] != findVal) {
                    break;
                }else {
                    resIndexList.add(temp);
                    temp += 1;
                }
            }
            return resIndexList;
        }
    }    
    

}

 

标签:二分,arr,right,return,int,findVal,查找,线性,left
来源: https://www.cnblogs.com/shengtudai/p/14423403.html