數組有很多常用的算法,本節將介紹常用的排序算法,包括冒泡排序、直接選擇排序和反轉排序。

4.5.1冒泡排序

        在程序設計中,經常需要將一組數列進行排序,這樣更加方便統計與查詢。程序常用的排序方法有冒泡排序、選擇排序和反轉排序等。本節將講解冒泡排序方法,它以簡潔的思想與實現方法而備受開發人員青睞,是廣大學習者最先接觸的一種排序算法。
        冒泡排序是最常用的數組排序算法之一,它排序數組元素的過程總是將較小的數往前放、較大的數往後放,類似水中氣泡往上升的動作,所以稱為冒泡排序。

1.基本思想

        冒泡排序的基本思想是對比相鄰的元素值,如果滿足條件就交換元素值,把較小的元素移動到數組前面,把較大的元素移動到數組後面(也就是交換兩個元素的位置),這樣較小的元素就像氣泡一樣從底部上升到頂部。

2.算法示例

        冒泡算法由雙層循環實現,其中外層循環用於控制排序輪數,一般為要排序的數組長度減1次,因為最後一次循環只剩下一個數組元素,不需要對比,同時數組已經完成排序了。而內層循環主要用於對比數組中每個鄰近元素的大小,以確定是否交換位置,對比和交換次數隨排序輪數而減少。例如,一個擁有6個元素的數組,在排序過程中每一次循環的排序過程。
        第1輪外層循環時把最大的元素值移動到了最後面(相應地,比最大的元素值小的元素向前移動,類似氣泡上升);第2輪外層循環不再對比最後一個元素值,因為它已經被確認為最大(不需要上升),應該放在最後,需要對比和移動的是其他剩餘元素。其他循環將以此類推,繼續完成排序任務。

3.算法實現

        下面來介紹一下冒泡排序的具體用法。
        【例1】冒泡排序
        在項目中創建BubbleSort類,這個類的代碼將對一個int型的一維數組中的元素進行冒泡排序。實例代碼如下:

public class BubbleSort{
    public static void main(String[] args){
        int[] array = {63,4,24,1,3,15};    //創建一個數組,元素是亂序的
        BubbleSort sorter = new BubbleSort();    //創建冒泡排序類的對象
        sorter.sort(array);    //調用排序方法,對數組排序
    }

    public void sort(int[] array){
        for(int i = 1;i < array.length;i++){
            //比較相鄰兩個元素,較大的元素往後冒泡
            for(int j = 0;j < array.length-i;j++){
                if(array[j] > array[j+1]){
                    int temp = array[j];    //把第一個元素值保存到臨時變量中
                    array[j] = array[j+1];    //把第二個元素值保存到第一個元素單元中
                    array[j+1] = temp;    //把臨時變量(第一個元素原值)保存到第二個元素單元中
                }
            }
        }
        showArray(array);    //輸出冒泡排序後的數組元素
    }

    public void showArray(int[] array){
        for (int i : array){    //遍歷數組
            System.out.print(">"+i);    //輸出每個數組元素值
        }
        System.out.println();
    }
}

運行結果如下:
>1>3>4>15>24>63

        從實例的運行結果來看,數組中的元素已經按從小到大的順序排列好了。冒泡排序的主要思想就是:把相鄰兩個元素進行比較,如滿足一定條件則進行交換(如判斷大小或日期前後等),每次循環都將最大(或最小)的元素排在最後,下一次循環是對數組中其他的元素進行類似操作。

4.5.2直接選擇排序

        直接選擇排序屬於選擇排序的一種,它的排序速度要比冒泡排序快一些,也是常用的排序算法,初學者應該掌握。

1.基本思想

        直接選擇排序的基本思想是將指定排序位置元素與其他數組元素分別對比,如果滿足條件就交換元素值。注意這裏與冒泡排序的區別,不是交換相鄰元素,而是把滿足條件的元素與指定的排序位置元素交換(如從最後一個元素開始排序),這樣排序好的位置逐漸擴大,直至整個數組都變成已排序好的格式。
        這就好比有一個小學生,從包含數字1~10的亂序的數字堆中分別選擇合適的數字,組成一個1~10的排序,而這個學生首先從數字堆中選出1,放在第一位,然後選出2(注意這時數字堆中已經沒有1了)放在第二位,以此類推,直到其找到數字9,放到8的後面,最後剩下10,就不用選擇了,直接放到最後就可以。
        與冒泡排序相比,直接選擇排序的交換次數要少很多,所以速度會快些。

2.算法示例

        每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序地放在已排好序的數列的最後,直到全部待排序的數據元素排完。例如:

初始數組資源【63 4 24 1 3 15】
第一趟排序後【15 4 24 1 3】63
第二趟排序後【15 4 3 1】24 63
第三趟排序後【1 4 3】15 24 63

第四趟排序後【1 3】4 15 24 63
第五趟排序後【1】3 4 15 24 63

3.算法實現

        下面來介紹一下直接選擇排序的具體用法。
        【例2】直接選擇排序
        在項目中創建SelectSort類,這個類的代碼將對一個int型的一維數組中的元素進行直接選擇排序。實例代碼如下:
 

public class SelectSort{
    public static void main(String[] args){
        int[] array = {63,4,24,1,3,15};    //創建一個數組,元素是亂序的
        SelectSort sorter = new SelectSort();    //創建直接排序類的對象
        sorter.sort(array);    //調用排序對象方法,對數組排序
    }

    public void sort(int[] array){
        int index;
        for(int i = 1;i < array.length;i++){
            index = 0;
            for(int j = 1;j <= array.length-i;j++){
                if(array[j] > array[index]){
                    index = j;
                }
            }
            //交換在位置array.length-i和index(最大值)上的兩個數
            int temp = array[array.length-i];    //把第一個元素值保存到臨時變量中    
            array[array.length-i] = array[index];    //把第二個元素值保存到第一個元素單元中    
            array[index] = temp;    //把臨時變量(第一個元素原值)保存到第二個元素單元中
        }
        showArray(array);    //輸出直接選擇排序後的數組元素
    }

    public void showArray(int[] array){
        for(int i : array){    //遍歷數組
            System.out.print(">"+i);    //輸出每個數組元素值
        }
        System.out.println();
    }
}

運行結果如下:
>1>3>4>15>24>63

4.5.3反轉排序

        顧名思義,反轉排序就是以相反的順序把原有數組的內容重新排序。反轉排序算法在程序開發中也經常用到。

1.基本思想

        反轉排序的基本思想比較簡單,也很好理解,其實現思路就是把數組最後一個元素與第一個元素替換,倒數第二個元素與第二個元素替換,以此類推,直到把所有數組元素反轉替換。

2.算法示例

        反轉排序是對數組兩邊的元素進行替換,所以只需要循環數組長度的半數次,如數組長度為7,那麼 for循環只需要循環3次。例如:

初始數組資源【10 20 30 40 50 60】
第一趟排序後  60【20 30 40 50】10
第二趟排序後  60 50【30 40】20 10
第三趟排序後  60 50 40 30 20 10

3.算法實現

        下面來介紹一下反轉排序的具體用法。
        【例3】反轉排序
        在項目中創建ReverseSot類,這個類的代碼將對一個int型的一維數組中的元素進行反轉排序。實例代碼如下:

public class ReverseSort{
    public static void main(String[] args){
        int[] array = {10,20,30,40,50,60};    //創建一個數組
        ReverseSort sorter = new ReverseSort();    //創建反轉排序類的對象
        sorter.sort(array);    //調用排序對象方法,將數組反轉
    }

    public void sort(int[] array){
        System.out.println("數組原有內容:");
        showArray(array);    //輸出排序前的數組元素
        int temp;
        int len = array.length;
        for(int i = 0;i < len/2;i++){
            temp = array[i];
            array[i] = array[len-1-i];
            array[len-1-i] = temp;
        }
        System.out.println("數組反轉後內容:");
        showArray(array);    //輸出排序後的數組元素
    }

    public void showArray(int[] array){
        for(int i : array){    //遍歷數組
            System.out.print("\t"+i);    //輸出每個數組元素值
        }
        System.out.println();
    }
}

運行結果如下:
數組原有內容:10 20 30 40 50 60
數組反轉後內容:60 50 40 30 20 10