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

Java排序算法實例:對10個隨機數進行排序 (Arrays.sort 與手寫選擇排序)

     編輯:Java 相關知識

Java數組排序實戰:API一鍵排序 vs 手寫選擇排序算法解析

本文展示如何生成10個隨機整數,使用 Arrays.sort() 快速排序,並手寫 選擇排序 算法演示原理。附帶插入新元素後再次排序的完整流程。

完整代碼 (SortDemo.java)

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class SortDemo {
    public static void main(String[] args) {
        // 1. 生成10個 1-100 隨機整數
        int[] arr = new int[11]; // 預留第11位用於插入
        Random random = new Random();
        System.out.print("原始隨機數組: ");
        for (int i = 0; i < 10; i++) {
            arr[i] = random.nextInt(100) + 1;
            System.out.print(arr[i] + " ");
        }
        System.out.println();

        // 2. 使用 JDK 內置排序 (雙軸快速排序, 針對基本類型)
        Arrays.sort(arr, 0, 10); // 只排前10個有效元素
        System.out.print("Arrays.sort 升序: ");
        for (int i = 0; i < 10; i++) System.out.print(arr[i] + " ");
        System.out.println();

        // 3. 手寫選擇排序 (教學演示)
        // 重新生成數據
        for (int i = 0; i < 10; i++) arr[i] = random.nextInt(100) + 1;
        selectionSort(arr, 10);
        System.out.print("選擇排序 升序: ");
        for (int i = 0; i < 10; i++) System.out.print(arr[i] + " ");
        System.out.println();

        // 4. 用戶輸入一個數,插入並重新排序
        Scanner scanner = new Scanner(System.in);
        System.out.print("\n請輸入一個整數插入數組: ");
        int newNum = scanner.nextInt();
        arr[10] = newNum; // 放入預留位
        Arrays.sort(arr); // 排序全部11個元素
        System.out.print("插入後排序: ");
        for (int i = 0; i < 11; i++) System.out.print(arr[i] + " ");
        System.out.println();

        scanner.close();
    }

    // 選擇排序: 每輪從未排序部分選最小, 放到已排序部分末尾
    public static void selectionSort(int[] arr, int n) {
        for (int i = 0; i < n - 1; i++) {
            int minIdx = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIdx]) minIdx = j;
            }
            if (minIdx != i) {
                int temp = arr[i];
                arr[i] = arr[minIdx];
                arr[minIdx] = temp;
            }
        }
    }
}

運行示例

原始隨機數組: 45 12 78 3 99 56 23 67 11 90
Arrays.sort 升序: 3 11 12 23 45 56 67 78 90 99
選擇排序 升序: 3 11 12 23 45 56 67 78 90 99

請輸入一個整數插入數組: 50
插入後排序: 3 11 12 23 45 50 56 67 78 90 99

排序算法核心對比

算法時間複雜度空間穩定性Java實現
Arrays.sort (基本類型)O(n log n)O(log n) 棧不穩定雙軸快速排序
Arrays.sort (對象數組)O(n log n)O(n)穩定TimSort (歸併+插入)
選擇排序O(n²)O(1)不穩定教學/極小數據/交換成本高
插入排序O(n²) / 最好O(n)O(1)穩定小數組/近乎有序/TimSort基礎
歸併排序O(n log n)O(n)穩定外部排序/併發/對象排序

實戰建議

  1. 生產代碼永遠用 Arrays.sort() / Collections.sort():經過極致優化、測試充分、支持並行 (Java 8+ Arrays.parallelSort())。
  2. 手寫排序僅用於:面試考察、教學理解、極特殊約束 (如嵌入式無庫、特定硬件指令優化)。
  3. 自定義排序:實現 Comparable 或傳入 Comparator (Lambda: (a,b) -> a - b 或 Comparator.comparingInt(...))。
  4. 基本類型 vs 包裝類:int[] 用快速排序 (不穩定);Integer[] 用 TimSort (穩定),大數據量時基本類型更省內存、更快。

進階:插入元素保持有序 (不重新全排序)

若數組已有序,插入新元素只需 二分查找插入位置 + 數組拷貝 (O(n)),優於 O(n log n) 全排序:

public static int[] insertSorted(int[] sortedArr, int value) {
    int[] newArr = new int[sortedArr.length + 1];
    // 二分查找插入索引
    int idx = Arrays.binarySearch(sortedArr, value);
    if (idx < 0) idx = -idx - 1; // 未找到時返回插入點
    // 複製前半段
    System.arraycopy(sortedArr, 0, newArr, 0, idx);
    // 插入新值
    newArr[idx] = value;
    // 複製後半段
    System.arraycopy(sortedArr, idx, newArr, idx + 1, sortedArr.length - idx);
    return newArr;
}

總結

掌握 Arrays.sort() 一鍵排序、理解選擇排序 O(n²) 原理、學會二分插入優化,能應對 99% Java 排序場景。生產環境堅決使用標準庫,手寫算法僅作理解與考試準備。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved