真正的Java數據結構之冒泡排序算法


 今天之前上網搜Java冒泡排序算法,看到很多都是錯誤的,所以自己就根據書上實現了一下:

/**
 * 測試冒泡排序
 * @author vincent
 *
 */
public class Maopao{
    
    //main方法
    public static void main(String[] args) {
        
        //定義要排序的數組數據
        int[] data = { 1, 5, 3, 54, 61 };
        
        //排序前輸出
        printArray(data);
        
        //進行排序
        int[] data1 = bubbleSort(data);
        
        //排序后輸出
        printArray(data1);
    }

    
    
    /**
     * <h4>冒泡排序(降序)</h4>
     * 
     * @param array
     *            要進行排序的int數組
     */
    public static int[] bubbleSort(int[] array) {

        //定義臨時變量,負責交換時的臨時數據
        int temp;
        
        //這一層循環是指每次都進行重新的、從頭的判斷交換排序
        for (int i = 0 ; i < array.length; i++) {
            
            //這里for的條件【j < array.length - 1】這樣做是為了防止下面的判斷出現[數組越界異常]!
            for (int j = 0; j < array.length - 1; j++) {
                
                //如果數組元素的當前(從第一個開始)值小於后一個元素的值
                if (array[j] > array[j + 1]) {
                    
                    //進行數據交換
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    
                }
                
            }
            
        }
        
        return array;
    }


    /**
     * 輸出數組元素
     * @param obj 要輸出的數組
     */
    public static void printArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + "  ");
        }
        System.out.println();
    }


}

程序運行流程,

未排序時:

[1, 5, 3, 54, 61]

第一次排序結果:

[5, 3, 54, 61, 1]

第二次排序結果:

[5, 54, 61, 3, 1]

第三次排序結果:

[54 , 61, 5, 3, 1]

第四次排序結果:

[61, 54, 5, 3, 1]

溫馨提示!這樣的遍歷並不是最佳的方式,因為每次都從頭開始到結尾排序。效率較低(雖然說冒泡本來就效率低),我們可以考慮一下,既然每次都把最小的數據(或者最大的數據)排到最后一個,那么我們完全可以這樣做,里面的每次比較只比較除了后一位的前面數據,文字比較繞口,看圖看代碼:  

圖片如下:

 
 
        
 
        

代碼:

/**
     * <h4>修改后的冒泡排序(降序)</h4>
     * 
     * @param array
     *            要進行排序的int數組
     */
    public static int[] bubbleSort(int[] array) {
        
        //定義臨時變量,負責交換時的臨時數據
        int temp;
        
        //這一層循環是指每次都進行重新的、從頭的判斷交換排序,但每次都比上一次少一次比較(最后兩個不做比較)
        for (int i = array.length - 1 ; i > 0; i--) {
            
            //這里的for的條件[j < i],因為每執行上面的for一次,i都會減1,
            //所以不會進行與第一次排序后的數組的最后一個數據進行比較,
            //比如:當i=3時,j<3,所以下面的這個for只遍歷三次,即前面四個數據的兩兩比較。
            for (int j = 0; j < i; j++) {
                
                //如果數組元素的當前(從第一個開始)值小於后一個元素的值
                if (array[j] < array[j + 1]) {
                    
                    //進行數據交換
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    
                }
                
            }
            
        }
        return array;
    }

 

特別說明:個人學習心得,望各位大神些批評指教!謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM