亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的Arrays.sort()方法實例分析

發布時間:2022-02-07 10:29:34 來源:億速云 閱讀:179 作者:iii 欄目:開發技術

本篇內容主要講解“Java的Arrays.sort()方法實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java的Arrays.sort()方法實例分析”吧!

首先看代碼:

// Use Quicksort on small arrays
if (right - left < QUICKSORT_THRESHOLD)
{
       //QUICKSORT_THRESHOLD = 286
        sort(a, left, right, true);
        return;
 }

  數組一進來,會碰到第一個閥值QUICKSORT_THRESHOLD(286),注解上說,小過這個閥值的進入Quicksort (快速排序),其實并不全是,點進去sort(a, left, right, true);方法:

// Use insertion sort on tiny arrays
if (length < INSERTION_SORT_THRESHOLD)
{
    if (leftmost)
    {
        ......

  點進去后我們看到第二個閥值INSERTION_SORT_THRESHOLD(47),如果元素少于47這個閥值,就用插入排序,往下看確實如此:

/*
 * Traditional (without sentinel) insertion sort,
 * optimized for server VM, is used in case of
 * the leftmost part.
 */
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;

Java的Arrays.sort()方法實例分析

元素少于47用插入排序

  至于大過INSERTION_SORT_THRESHOLD(47)的,用一種快速排序的方法:

  1.從數列中挑出五個元素,稱為 “基準”(pivot);

  2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊)。在這個分區退出之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作;

  3.遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序。

快速排序(Quick Sort)

  這是少于閥值QUICKSORT_THRESHOLD(286)的兩種情況,至于大于286的,它會進入歸并排序(Merge Sort),但在此之前,它有個小動作:

// Check if the array is nearly sorted
    for (int k = left; k < right; run[count] = k) {        if (a[k] < a[k + 1]) { // ascending
            while (++k <= right && a[k - 1] <= a[k]);
        } else if (a[k] > a[k + 1]) { // descending
            while (++k <= right && a[k - 1] >= a[k]);            for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {                int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
            }
        } else { // equal
            for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {                if (--m == 0) {
                    sort(a, left, right, true);                    return;
                }
            }
        }        /*
         * The array is not highly structured,
         * use Quicksort instead of merge sort.
         */
        if (++count == MAX_RUN_COUNT) {
            sort(a, left, right, true);            return;
        }
    }

  這里主要作用是看他數組具不具備結構:實際邏輯是分組排序,每降序為一個組,像1,9,8,7,6,8。9到6是降序,為一個組,然后把降序的一組排成升序:1,6,7,8,9,8。然后最后的8后面繼續往后面找。

  每遇到這樣一個降序組,++count,當count大于MAX_RUN_COUNT(67),被判斷為這個數組不具備結構(也就是這數據時而升時而降),然后送給之前的sort(里面的快速排序)的方法(The array is not highly structured,use Quicksort instead of merge sort.)

  如果count少于MAX_RUN_COUNT(67)的,說明這個數組還有點結構,就繼續往下走下面的歸并排序。

總結:

  從上面分析,Arrays.sort并不是單一的排序,而是插入排序,快速排序,歸并排序三種排序的組合,為此我畫了個流程圖:

Java的Arrays.sort()方法實例分析

  O(nlogn)只代表增長量級,同一個量級前面的常數也可以不一樣,不同數量下面的實際運算時間也可以不一樣。

  數量非常小的情況下(就像上面說到的,少于47的),插入排序等可能會比快速排序更快。 所以數組少于47的會進入插入排序。

  快排數據越無序越快(加入隨機化后基本不會退化),平均常數最小,不需要額外空間,不穩定排序。

  歸排速度穩定,常數比快排略大,需要額外空間,穩定排序。

  所以大于或等于47或少于286會進入快排,而在大于或等于286后,會有個小動作:“// Check if the array is nearly sorted”。這里第一個作用是先梳理一下數據方便后續的歸并排序,第二個作用就是即便大于286,但在降序組太多的時候(被判斷為沒有結構的數據,The array is not highly structured,use Quicksort instead of merge sort.),要轉回快速排序。

到此,相信大家對“Java的Arrays.sort()方法實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旺苍县| 夏河县| 龙口市| 乐东| 凤翔县| 高雄县| 渭南市| 苍梧县| 新源县| 普洱| 类乌齐县| 南和县| 沧源| 黄龙县| 株洲县| 高邮市| 定州市| 南郑县| 商丘市| 衡水市| 崇州市| 桐乡市| 巴楚县| 德安县| 治多县| 扶沟县| 施甸县| 邳州市| 荔浦县| 曲麻莱县| 临颍县| 北碚区| 贡山| 渭源县| 吕梁市| 卢湾区| 大连市| 晋江市| 肥城市| 宝山区| 凤城市|