欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何使用java中Arrays.sort()

小編這次要給大家分享的是如何使用java中Arrays.sort(),文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

十余年的潞城網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整潞城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“潞城網(wǎng)站設(shè)計”,“潞城網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。

Java的Arrays類中有一個sort()方法,該方法是Arrays類的靜態(tài)方法,在需要對數(shù)組進行排序時,非常的好用。

但是sort()的參數(shù)有好幾種,基本上是大同小異,下面是以int型數(shù)組為例的Arrays.sort()的典型用法

import java.util.Arrays;
import java.util.Comparator;

/**
 * Arrays.sort()排序
 */
public class SortTest
{
  public static void main(String []args)
  {
    int[] ints=new int[]{2,324,4,57,1};

    System.out.println("增序排序后順序");
    Arrays.sort(ints);
    for (int i=0;i<ints.length;i++)
    {
      System.out.print(ints[i]+" ");
    }

    System.out.println("\n減序排序后順序");
    //要實現(xiàn)減序排序,得通過包裝類型數(shù)組,基本類型數(shù)組是不行滴
    Integer[] integers=new Integer[]{2,324,4,4,6,1};
    Arrays.sort(integers, new Comparator<Integer>()
    {
      /*
      * 此處與c++的比較函數(shù)構(gòu)成不一致
      * c++返回bool型,而Java返回的為int型
      * 當(dāng)返回值>0時
      * 進行交換,即排序(源碼實現(xiàn)為兩樞軸快速排序)
       */
      public int compare(Integer o1, Integer o2)
      {
        return o2-o1;
      }


      public boolean equals(Object obj)
      {
        return false;
      }
    });
    for (Integer integer:integers)
    {
      System.out.print(integer+" ");
    }

    System.out.println("\n對部分排序后順序");
    int[] ints2=new int[]{212,43,2,324,4,4,57,1};
    //對數(shù)組的[2,6)位進行排序

    Arrays.sort(ints2,2,6);
    for (int i=0;i<ints2.length;i++)
    {
      System.out.print(ints2[i]+" ");
    }

  }
}

排序結(jié)果如下

增序排序后順序
1 2 4 57 324
減序排序后順序
324 6 4 4 2 1
對部分排序后順序
212 43 2 4 4 324 57 1

打開Arrays.sort()源碼,還是以int型為例,其他類型也是大同小異

 public static void sort(int[] a) {
    DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
  }

 public static void sort(int[] a, int fromIndex, int toIndex) {
    rangeCheck(a.length, fromIndex, toIndex);
    DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0);
  }

從源碼中發(fā)現(xiàn),兩種參數(shù)類型的sort方法都調(diào)用了 DualPivotQuicksort.sort()方法
繼續(xù)跟蹤源碼

static void sort(int[] a, int left, int right,
           int[] work, int workBase, int workLen) {
    // Use Quicksort on small arrays
    if (right - left < QUICKSORT_THRESHOLD) {
      sort(a, left, right, true);
      return;
    }

    /*
     * Index run[i] is the start of i-th run
     * (ascending or descending sequence).
     */
    int[] run = new int[MAX_RUN_COUNT + 1];
    int count = 0; run[0] = left;

    // 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;
      }
    }

    // Check special cases
    // Implementation note: variable "right" is increased by 1.
    if (run[count] == right++) { // The last run contains one element
      run[++count] = right;
    } else if (count == 1) { // The array is already sorted
      return;
    }

    // Determine alternation base for merge
    byte odd = 0;
    for (int n = 1; (n <<= 1) < count; odd ^= 1);

    // Use or create temporary array b for merging
    int[] b;         // temp array; alternates with a
    int ao, bo;       // array offsets from 'left'
    int blen = right - left; // space needed for b
    if (work == null || workLen < blen || workBase + blen > work.length) {
      work = new int[blen];
      workBase = 0;
    }
    if (odd == 0) {
      System.arraycopy(a, left, work, workBase, blen);
      b = a;
      bo = 0;
      a = work;
      ao = workBase - left;
    } else {
      b = work;
      ao = 0;
      bo = workBase - left;
    }

    // Merging
    for (int last; count > 1; count = last) {
      for (int k = (last = 0) + 2; k <= count; k += 2) {
        int hi = run[k], mi = run[k - 1];
        for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
          if (q >= hi || p < mi && a[p + ao] <= a[q + ao]) {
            b[i + bo] = a[p++ + ao];
          } else {
            b[i + bo] = a[q++ + ao];
          }
        }
        run[++last] = hi;
      }
      if ((count & 1) != 0) {
        for (int i = right, lo = run[count - 1]; --i >= lo;
          b[i + bo] = a[i + ao]
        );
        run[++last] = right;
      }
      int[] t = a; a = b; b = t;
      int o = ao; ao = bo; bo = o;
    }
  }

結(jié)合文檔以及源代碼,我們發(fā)現(xiàn),jdk中的Arrays.sort()的實現(xiàn)是通過所謂的雙軸快排的算法

/**
 * This class implements the Dual-Pivot Quicksort algorithm by
 * Vladimir Yaroslavskiy, Jon Bentley, and Josh Bloch. The algorithm
 * offers O(n log(n)) performance on many data sets that cause other
 * quicksorts to degrade to quadratic performance, and is typically
 * faster than traditional (one-pivot) Quicksort implementations.
 *
 * All exposed methods are package-private, designed to be invoked
 * from public methods (in class Arrays) after performing any
 * necessary array bounds checks and expanding parameters into the
 * required forms.
 *
 * @author Vladimir Yaroslavskiy
 * @author Jon Bentley
 * @author Josh Bloch
 *
 * @version 2011.02.11 m765.827.12i:5\7pm
 * @since 1.7
 */

Java1.8的快排是一種雙軸快排,顧名思義:雙軸快排是基于兩個軸來進行比較,跟普通的選擇一個點來作為軸點的快排是有很大的區(qū)別的,雙軸排序利用了區(qū)間相鄰的特性,對原本的快排進行了效率上的提高,很大程度上是利用了數(shù)學(xué)的一些特性。。。。。嗯。。。反正很高深的樣子

算法步驟

1.對于很小的數(shù)組(長度小于27),會使用插入排序。
2.選擇兩個點P1,P2作為軸心,比如我們可以使用第一個元素和最后一個元素。
3.P1必須比P2要小,否則將這兩個元素交換,現(xiàn)在將整個數(shù)組分為四部分:
(1)第一部分:比P1小的元素。
(2)第二部分:比P1大但是比P2小的元素。
(3)第三部分:比P2大的元素。
(4)第四部分:尚未比較的部分。
在開始比較前,除了軸點,其余元素幾乎都在第四部分,直到比較完之后第四部分沒有元素。
4.從第四部分選出一個元素a[K],與兩個軸心比較,然后放到第一二三部分中的一個。
5.移動L,K,G指向。
6.重復(fù) 4 5 步,直到第四部分沒有元素。
7.將P1與第一部分的最后一個元素交換。將P2與第三部分的第一個元素交換。
8.遞歸的將第一二三部分排序。

看完這篇關(guān)于如何使用java中Arrays.sort()的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。

網(wǎng)頁名稱:如何使用java中Arrays.sort()
本文地址:http://aaarwkj.com/article16/gjdgdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、靜態(tài)網(wǎng)站標(biāo)簽優(yōu)化、App設(shè)計、網(wǎng)站建設(shè)、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
欧美精品在线高清观看| 日韩在线电影二区三区| 久久99热这里只频精品| 亚洲欧美日韩综合精品久久| 国内激情自拍偷拍视频| 激情五月婷婷我有我色 | 天堂中文在线官网在线| 亚洲精品一区二区三区pp| 欧美一级特黄大片免色| 久久精品国产一区电影| 91精品蜜臀国产综合久久久久久| 欧美成人精品欧美一级乱| 国产情侣自拍在线观看| 91桃色网站在线免费观看| 国产熟女真实乱精品视频| 国产激情福利一区二区| 日韩欧美二区三区精品在线| 日韩av裸体在线播放| 日本中文字幕区二区三区电影| 精品日韩av高清一区二区三区| 日本大片在线一区二区三区| 久久久久四虎国产精品| 欧美大片免费久久精品| 999久久免费精品国产| 成人免费视频观看国产| 欧美日韩福利视频在线| 亚洲码与欧洲码一二三| 国产又粗又爽视频免费| 一区二区三区av夏目彩春| 国产精品大屁股一区二区| 国产激情av网站在线观看| 黑寡妇精品欧美一区二区毛 | 日本高清有码中文字幕| 欧美小黄片在线免费看| 日本高清不卡在线播放| 日本成人大片在线观看| av一区二区日韩精品久| 色婷婷亚洲一区二区三区| 免费人妻一区二区三区| 91嫩草中文字幕在线| 亚洲熟乱熟女一区二区|