算法之二分查找法和冒泡排序

97 阅读2分钟

二分查找法

属于递归查找的一种,只适用于从有序的数列中进行查找

public class binarySearch {
    public static int binarySearch(int [] array ,int a){

        int low=0;
        int high=array.length-1;
        int mid;
        while(low<=high){
            mid=(low+high)/2;
            if(array[mid]==a){
                return mid;
            }else if(a>array[mid]){
                low=mid+1;
            }else{
                high=mid-1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] array=new int[]{1,2,3,4,5,6,7,8,9};
        int mid=binarySearch(array,7);
        System.out.println(mid);
    }}
    
    结果是6

冒泡排序

两个相邻的数比较大小,将两个数中较大的数往右边放,小的往左边放

public class bubbleAlgorithm {
    //冒泡排序方法:
    public static int[] bubblesort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
        //外层循环控制排序趟输
        //第一趟下来,最大的移动到右边了
        for (int i = 0; i < arr.length - 1; i++) {
            //内层循环控制每一趟排序多少次
            boolean isSorted  = true;//有序标记,每一轮的初始是true
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
           // 如果在本轮排序中,元素有交换,则说明数列无序;如果没有元素交换,说明数列已然有序,直接跳出大循环。
            if(isSorted )
                break;
        }
        return arr;
    }

对以上冒泡排序方法进行优化

    
    public static int[] bubbleSort1(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
//记录最后一次交换的位置
        int lastExchangeIndex = 0;
//无序数列的边界,每次比较只需要比到这里为止
//在每一轮排序的最后,记录一下最后一次元素交换的位置,那个位置也就是无序数列的边界,再往后就是有序区了。
      
        int sortBorder = arr.length - 1;
        for (int i = 0; i < arr.length - 1; i++) {
            boolean isSorted  = true;//有序标记,每一轮的初始是true
            System.out.println("sortBorder==="+sortBorder);
            for (int j = 0; j < sortBorder; j++) {
                if (arr[j + 1] < arr[j]) {
                    isSorted  = false;//有元素交换,所以不是有序,标记变为false
                    int t = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = t;
                    lastExchangeIndex = j;
                }
            }
            sortBorder = lastExchangeIndex;
            //一趟下来是否发生位置交换,如果没有交换直接跳出大循环
            if(isSorted )
                break;
        }
        return arr;
    }
    public static void main(String[] args) {
        int[] array = new int[]{1,2,5,4,3,8,9};
        //int[] arr = bubblesort(array);
        int[] arr =bubbleSort1(array);
        for (int i : arr) {
            System.out.println(i);
        }

    }
}
//结果:6

4ed28c28f38aef9d56331635f723178.png