1. 程式人生 > >Java之陣列排序及二分法查詢

Java之陣列排序及二分法查詢

首先先介紹兩種最基本的陣列排序方法:冒泡法選擇法冒泡法排序:依次比較相鄰的兩個元素,如果第一個比第二個大,則交換他們兩個,如此一輪比較下來會產生一個最大的數位於陣列末尾,第二次比較則進行到陣列長度-1個元素,以此類推。

    /**
     *  冒泡法排序(從小到大)
     * @param a 需要排序的陣列
     * @return  排序完成後的陣列
     */
    public static int[] sort1(int[] a) {
        for(int i = 0;i < a.length-1;i++) {
            for
(int j = 0;j < a.length-1-i;j++) { if(a[j]>a[j+1]) { int temp; temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } return a; }

選擇法排序:先用第一個元素依次和剩下的元素進行比較,如果此元素大於另一個元素,則交換他們,依次類推,直至比較到最後一個元素。

/**
     *  選擇法排序
     * @param a
     * @return
     */
    public static int[] sort2(int[] a) {
        for(int i = 0;i < a.length;i++) {
            for(int j = i+1;j < a.length;j++) { 
                if(a[i]>a[j]) {
                    int temp;
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
        return
a; }

二分法查詢: 使用二分法查詢的陣列必須是已經進行排序好的陣列,首先定義一個初始下標,一個結尾下標,然後用需要查詢的數同陣列中的中間元素進行對比,如果相等,則返回中間陣列元素下標,如果大於此元素,則讓初始下標等於中間下標加一,再次進行對比,直到返回一箇中間下標或者未找到,反之亦然。(中間下標 = (初始下標 + 結尾下標) / 2)

    /**
     *  二分法查詢
     * @param a 需要進行檢索的陣列
     * @param idx 需要檢索的值
     * @return 檢索結果(該值下標或-1:未找到)
     */
    public static int index(int[] a,int idx) {
        int min = 0;
        int max = a.length-1;   
        while(min <= max) {
            int middle = (min + max)/2;
            if(a[middle] == idx) {
                return middle;
            }
            if(idx > a[middle]) {
                min = middle+1;
            }
            else {
                max = middle - 1;
            }
        }
        return -1;      
    }

下面對以上方法進行測試

    public static void main(String[] args) {
        int[] a = {3,10,15,11,6,7};
        for(int x:sort1(a)) {
            System.out.print(x + "\t");
        }
        System.out.println();
        int[] b = {5,1,3,7,2,44,12,3};
        for(int y:sort2(b)) {
            System.out.print(y + "\t");
        }
        System.out.println();
        int[] c = sort2(b);
        System.out.println(index(c,22));
    }
    /**
     * output:
     * 3    6   7   10  11  15
     * 1    2   3   5   7   12  44
     * -1
     */