Java之二分查找-yellowcong

来源:互联网 发布:三一重工大数据平台 编辑:程序博客网 时间:2024/06/05 21:58

二分查找,是用来处理有序的数组的,其时间复杂度为 O(logN) ,二分查找的方式有两种,一种是通过while循环来实现,另一种是通过递归的方式来实现,其中原理也挺简单,就是判断中间数和需要查找的数大小关系,如果小,就增加地位数,如果大,就减少高位数,保证范围不断缩小。

代码

在面试过程中,我们需要掌握冒泡排序,选择排序,快速排序,以及二分法,还有一些数据的链表(单项,双向),Tree,BTree,红黑树等数据结构。

package com.yellowcong.controller;public class Demo3 {    public static void main(String[] args) {        int[] array = new int[] { 12, 123, 132, 13, 13, 1, 32, 3, 13, 12, 31, 23, 13, 1, 31, 3, 13, 3213, 13, 131, 31,                313131 };        System.out.println(array.length);        // 快速排序的方法        // quickSort(array,0,array.length-1);        // 冒泡排序        bubbleSort(array);        //快速排序        quickSort(array, 0, array.length-1);        StringBuffer sb = new StringBuffer();        for (int val : array) {            sb.append(val + ",");        }        System.out.println(sb.toString());        //二分查找        int index = biSearch(array,31,0,array.length-1);        System.out.println(index);        index = biSearchLast(array,31);        System.out.println(index);    }    /**     * 查找最后一次出现的位置     * @param array     * @param data     * @return     */    private static int biSearchLast(int [] array,int data){        int low = 0;        int high = array.length - 1;        int middle ;        while(low < high){            middle = (low +high)/2;            //数据大于灯具中间数的情况,就表示,数据不在低位的前一部分            if(array[middle] <= data ){                low=middle;            }else{                //当数据比中间数小的情况 ,就表示在高位了                high = middle -1 ;            }        }        if(array[low] == data){            return low;        }else{            return -1 ;        }    }    /**     * 通过递归的方式来进二分查找     * @param array 数据     * @param data 数组     * @param low  低位     * @param high 高位     * @return     */    public static int biSearch(int[] array,int data ,int low,int high) {        if(low <= high){            int middle = (low+high)/2;            if(array[middle] == data){                return middle;            }else if(array[middle] <data ){                low ++;                return biSearch(array,data ,low,high);             }else if(array[middle] >data){                high--;                return biSearch(array,data,low,high);             }        }        return -1;    }    /**     * 二分查找     * 这个是通过while的方式     * @param array     * @param data     *            需要查找的字符     */    private static int biSearch(int[] array, int data) {        int middle ;        int low = 0;        int high = array.length -1;        while(low <high){            middle = (high+low)/2;            if(data == array[middle]){                return middle;            }else if(data > array[middle]){                low ++ ;                }else if(data <array[middle]){                high -- ;            }        }        // - 1表示没有找到的情况        return -1 ;    }    /**     * 选择排序     *      * @param array     */    private static void selectSort(int[] array) {        for (int i = 0; i < array.length - 1; i++) {            for (int j = i + 1; j < array.length; j++) {                if (array[i] > array[j]) {                    int tmp = array[i];                    array[i] = array[j];                    array[j] = tmp;                }            }        }    }    /**     * 冒泡排序     *      * @param array     */    private static void bubbleSort(int[] array) {        for (int i = 0; i < array.length - 1; i++) {            for (int j = 0; j < array.length - i - 1; j++) {                if (array[j] > array[j + 1]) {                    int tmp = array[j];                    array[j] = array[j + 1];                    array[j + 1] = tmp;                }            }        }    }    private static int getMiddle(int[] data, int low, int high) {        int tmp = data[low];        while (low < high) {            while (low < high && data[high] >= tmp) {                high--;            }            data[low] = data[high];            while (low < high && data[low] <= tmp) {                low++;            }            data[high] = data[low];        }        data[low] = tmp;        return low;    }    /**     * 快速排序     * @param data 数组     * @param low  开始     * @param high 结束      */    private static void quickSort(int[] data, int low, int high) {        if (low < high) {            int middle = getMiddle(data, low, high);            quickSort(data, low, middle - 1);            quickSort(data, middle + 1, high);        }    }}
原创粉丝点击