java.util.Arrays的排序程式實現代碼(1/2)

來源:互聯網
上載者:User

(1) 基礎資料型別 (Elementary Data Type)數組的排序,如Arrays.sort(int[])等。採用了一種經過調優的快速排序。該演算法改編自 Jon L. Bentley 和 M. Douglas McIlroy 合著的 Engineering a Sort Function", Software-Practice and Experience Vol. 23(11) P. 1249-1265 (November 1993)。此演算法在許多資料集上提供 n*log(n) 效能,這導致其他快速排序會降低二次型效能。
下面是JDK中調優快速排序演算法的原始碼:

 代碼如下 複製代碼

   /**
     * 將指定範圍的整形數組升序排序。
     * x[] 待排數組
     * off 從數組的第off個元素開始排序
     * len 數組長度
     */
    private static void sort1(int x[], int off, int len) {
 //最佳化1:在小規模(size<7)數組中,直接插入排序的效率要比快速排序高。
 if (len < 7) {
     for (int i=off; i<len+off; i++)
      for (int j=i; j>off && x[j-1]>x[j]; j--)
       swap(x, j, j-1);
     return;
 }
 //最佳化2:精心選擇劃分元素,即樞軸
 //如果是小規模數組(size<=7),直接取中間元素作為樞軸
 //如果是中等規模數組(7=<size<=40),則在數組首、中、尾三個位置上的數中取中間大小的數作為樞軸
 //如果是大規模數組(size>40),則在9個指定的數中取一個偽中數(中間大小的數s)
 int m = off + (len >> 1);
 if (len > 7) {
     int l = off;
     int n = off + len - 1;
     if (len > 40) {       
   int s = len/8;
   l = med3(x, l, l+s, l+2*s);
   m = med3(x, m-s,   m,   m+s);
   n = med3(x, n-2*s, n-s, n);
     }
     m = med3(x, l, m, n);
 }
 int v = x[m];
         //最佳化3:每一次樞軸v的劃分,都會形成形成一個形如  (<v)* v* (>v)*
        //階段一,形成 v* (<v)* (>v)* v* 的數組
        int a = off, b = a, c = off + len - 1, d = c;
        while(true) {
     while (b <= c && x[b] <= v) {
   if (x[b] == v)
       swap(x, a++, b);
   b++;
     }
     while (c >= b && x[c] >= v) {
   if (x[c] == v)
       swap(x, c, d--);
   c--;
     }
     if (b > c)
      break;
     swap(x, b++, c--);
 }
 //階段二,將樞軸和與樞軸相等的元素交換到數組中間
 int s, n = off + len;
 s = Math.min(a-off, b-a  );  vecswap(x, off, b-s, s);
 s = Math.min(d-c,   n-d-1);  vecswap(x, b,   n-s, s);
 //階段三,遞迴排序與樞軸不相等都元素區間
 if ((s = b-a) > 1)
     sort1(x, off, s);
 if ((s = d-c) > 1)
     sort1(x, n-s, s);
    }


 

★ 最佳化1:在小規模(size<7)數組中,直接插入排序的效率要比快速排序高。

      沒有一種排序在任何情況下都是最優的《基於比較的內部排序總結 》。 O(N^2)層級的排序看起來似乎比所有先進排序要差的多。但實際上也並非如此,Arrays中的sort()演算法就給了我們一個很好的例子。當待排數組規模非常小的時候(JDK中規模的閾值為INSERTIONSORT_THRESHOLD=7),直接插入排序反而要比快排,歸併排序要好。

    這個道理很簡單。數組規模小,簡單演算法的比較次數不會比先進演算法多多少。相反,諸如快排,歸併排序等先進演算法使用遞迴操作,所付出的運行代價更高。

首頁 1 2 末頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.