首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Arrays.sort() 排序完全指南:基本型別、對象陣列、自定義 Comparator 與算法原理

     編輯:Java 程式設計入門

java.util.Arrays 提供高效排序工具,底層採用雙軸快速排序(基本型別)與歸併排序(對象),支援範圍排序、並行排序與自定義比較器。本文全面講解用法、原理與效能特徵。

1. 基本型別陣列排序

API 簽名

static void sort(int[] a)                    // 全量升序
static void sort(int[] a, int from, int to)  // 範圍排序 [from, to)

支援所有基本型別:byte, short, int, long, float, double, char。

範例:預設升序

int[] arr = {5, 2, -1, 8, 0};
Arrays.sort(arr); // [-1, 0, 2, 5, 8]

降序策略

基本型無直接降序 API,兩種方案:

  1. 升序後反轉(原地,O(1) 空間)
  2. 轉包裝類陣列用 Comparator(需額外空間)
// 方案一:升序 + 反轉
Arrays.sort(arr);
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
    int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}

// 方案二:包裝類 + Comparator(JDK 8+)
Integer[] boxed = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Arrays.sort(boxed, Comparator.reverseOrder());

2. 對象陣列排序與 Comparator

API 簽名

static  void sort(T[] a, Comparator c)
static  void sort(T[] a, int from, int to, Comparator c)

實戰:多鍵值排序

class Point {
    int x, y;
    Point(int x, int y) { this.x = x; this.y = y; }
}

Point[] points = {new Point(2,1), new Point(2,2), new Point(1,2), new Point(0,1)};

// x 升序,x 相同則 y 升序
Arrays.sort(points, (p1, p2) -> {
    if (p1.x != p2.x) return Integer.compare(p1.x, p2.x);
    return Integer.compare(p1.y, p2.y);
});
// 結果:(0,1) (1,2) (2,1) (2,2)

Comparator 靜態工廠方法(JDK 8+)

// 等價於上面 Lambda
Arrays.sort(points, 
    Comparator.comparingInt((Point p) -> p.x)
              .thenComparingInt(p -> p.y));

3. 算法原理與效能特徵

陣列類型算法時間複雜度穩定性空間
基本型別雙軸快速排序O(n log n) 平均不穩定O(log n) 棧
對象/包裝類TimSort(歸併變體)O(n log n) 最壞穩定O(n) 輔助陣列

設計原因:基本型別無身份認同,不穩定可接受且快排更快;對象需穩定性保證相等元素相對順序,TimSort 利用已有序片段(runs)極適合真實數據。

4. 並行排序(JDK 8+)

Arrays.parallelSort(largeArray); // 自動分治多線程,大數據量顯著加速
  • 閾值約 8192 元素以下退化為串行
  • 適用於多核 CPU、大型陣列(>10萬元素)

5. 常見坑點避雷

  1. 基本型別陣列不可用 Comparator:編譯錯誤,必須轉包裝類
  2. Arrays.asList() 返回固定長度 List,不可 sort(支援 Collections.sort() 但底層陣列不可變)
  3. null 元素處理:Comparator 需顯式處理 null,否則 NPE
  4. 浮點數比較:用 Double.compare() 而非 d1 - d2(溢出/NaN 問題)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved