高效排序方法——java源碼學習

今天在學習Arrays這個類中的一個方法的時候讓我產生了濃厚的興趣,是什麼方法呢?就是sort()這個方法,爲什麼呢?因爲我很好奇java的開發者是如何來寫這個排序算法的。當我跟蹤進入到內部代碼找到了sort()方法的一個小部分(裏面有很多不同的內容,我只提取出來我想要的,有興趣的同學可以自己去看看。)就是下面的代碼。

for (int i = left, j = i; i < right; j = ++i) {
     int ai = a[i + 1];
     while (ai < a[j]) {
         a[j + 1] = a[j];
         if (j-- == left) {
            break;
         }
     }
     a[j + 1] = ai;
}

開着很簡單,但是我自己卻逐步演示例三遍才完全進入到正確的思路中,就因爲 if 語句中那個 j-- 。然後我就對它進行了修改變成了我想要的樣子。具體如下:

public class Main {
    public static void main(String[] args) {
        int[] arr = {12,3,1,55,43,58};
        kuaiSortUp(arr);
       
    }

    public static void kuaiSortUp(int[] arr){
        for (int i = 0,j = i; i < arr.length-1; j = ++ i) {
            int temp = arr[i+1];
            while(temp < arr[j]){
                arr[j+1] = arr[j];
                if(j-- == 0){
                    break;
                }
            }
            arr[j+1] = temp;
        }

        for (int i = 0; i++ < arr.length; ) {
            System.out.print(arr[i-1]+" ");
        }
    }
}

簡化的每一次 for 循環結果如下:

 /**
     *    1:j=i=0   {12,3,1,55,43,58}
     *    2:{3,12,1,55,43,58}   j=i=1
     *    3:{3,1,12,55,43,58}   j=i=2
     *    4:{1,3,12,55,43,58}   j=i=3
     *    5:{1,3,12,43,55,58}   j=i=4
     *    6:{1,3,12,43,55,58}
     */

具體如何執行程序還需要自己多加揣摩,我只能提醒在 if 語句這個地方要多加註意,希望你和我一樣能有所收穫。

後來根據這一段代碼我又找到了一種不同的 for 語句編程方式,在一些遍歷數組或集合元素的場合能夠跟顯你的高深,具體如下:

public class Main {
    public static void main(String[] args) {
        int[] arr = {12,3,1,55,43,58};

        for (int i = 0; i++ < arr.length; ) {
            System.out.print(arr[i-1]+" ");
        }
    }
}

 

         

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章