java學習-二分查找

import java.util.Random;
import java.util.Scanner;
public class BinaryFind {

    //生成隨機數 然後排序 再二分查找  用作理解二分查找
    public static void main(String[] args) {
        Random r=new Random();
        System.out.print("輸入一個數:");
        Scanner s=new Scanner(System.in);
        int len=s.nextInt();
        int[] num=new int[len];
        //生成隨機數 個數爲len
        for(int i=0;i<num.length;i++){
            num[i]=r.nextInt(999);
        }
        System.out.print("\n排序前:");
        for(int i=0;i<num.length;i++){
            System.out.print(num[i]+" ");
        }
        int findNum=num[0]; 
        quckSort(num,0,len-1);
        System.out.print("\n排序後:");
        for(int i=0;i<num.length;i++){
            System.out.print(num[i]+" ");
        }
    //  BinarySearch(num,0,len-1,findNum);//肯定有的
        System.out.println("\n找到下標爲:"+BinarySearch2(num,findNum));

    }

    //快排
    public static void quckSort(int[] arr,int left,int right){
        if(left<right){
        int l=left,r=right,pivot=arr[l];
            while(l<r){
                while(l<r&&arr[r]>pivot)r--;
                if(l<r)
                    arr[l++]=arr[r];
                while(l<r&&arr[l]<pivot)l++;
                if(l<r)
                    arr[r--]=arr[l];
            }
            arr[l]=pivot;
            quckSort(arr,left,l-1);
            quckSort(arr,l+1,right);
        }
    }

    //二分查找 遞歸 有點麻煩
    public static void BinarySearch(int[] arr,int left,int right,int findVal){
        int middleIndex=(left+right)/2;
        if(left<right){ 
        if(findVal>arr[middleIndex]){
            left=middleIndex+1;     
        }else if(findVal<arr[middleIndex]){
            right=middleIndex-1;
        }else if(findVal==arr[middleIndex]){
            System.out.println("\n找到了,索引是:"+middleIndex);
            return;
        }
        BinarySearch(arr,left,right,findVal);
    }else{
        System.out.println("\n not found");
    }       
    }
    //二分查找 比較容易理解
    public static int BinarySearch2(int[] arr,int findVal){
        int left=0;
        int right=arr.length;

        while(left<=right){
            int middleIndex=(left+right)/2;
            if(findVal==arr[middleIndex])
                return middleIndex;
            if(findVal>arr[middleIndex])
                left=middleIndex+1;
            else
                right=middleIndex-1;

        }
        return -1;

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章