Java | ソートアルゴリズムの図解(バブルソート/選択ソート/高速ソートのイメージ)

Java Java
スポンサーリンク

以下に バブルソート・選択ソート・クイックソート(再帰版)を同じ配列で比較できる「完全な Java コード」 をまとめました。

ポイント:

  • 元の配列は original として保存
  • ソートするときは copyOf でコピーしてから実行
  • 各ソートの結果を並べて比較できるようにまとめて表示

すぐコンパイル&実行できます。


3種類のソートを比較する Java 完全コード

import java.util.Arrays;

public class SortComparison {

    public static void main(String[] args) {
        int[] original = {5, 3, 8, 1, 4};

        System.out.println("元の配列: " + Arrays.toString(original));

        // バブルソート
        int[] bubbleArr = Arrays.copyOf(original, original.length);
        bubbleSort(bubbleArr);
        System.out.println("バブルソート: " + Arrays.toString(bubbleArr));

        // 選択ソート
        int[] selectArr = Arrays.copyOf(original, original.length);
        selectionSort(selectArr);
        System.out.println("選択ソート: " + Arrays.toString(selectArr));

        // クイックソート
        int[] quickArr = Arrays.copyOf(original, original.length);
        quickSort(quickArr, 0, quickArr.length - 1);
        System.out.println("クイックソート: " + Arrays.toString(quickArr));
    }

    // -------------------------
    // バブルソート
    // -------------------------
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        boolean swapped;

        for (int i = 0; i < n - 1; i++) {
            swapped = false;

            for (int j = 0; j < n - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                    swapped = true;
                }
            }

            // 交換が一度も行われなければ終了
            if (!swapped) break;
        }
    }

    // -------------------------
    // 選択ソート
    // -------------------------
    public static void selectionSort(int[] arr) {
        int n = arr.length;

        for (int i = 0; i < n - 1; i++) {
            int minIndex = i;

            // 最小値を探す
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }

            // 見つかった最小値をi番目と交換
            int tmp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = tmp;
        }
    }

    // -------------------------
    // クイックソート(再帰)
    // -------------------------
    public static void quickSort(int[] arr, int left, int right) {
        if (left >= right) return;

        int pivot = arr[(left + right) / 2]; // 真ん中をpivotに
        int index = partition(arr, left, right, pivot);

        quickSort(arr, left, index - 1);
        quickSort(arr, index, right);
    }

    public static int partition(int[] arr, int left, int right, int pivot) {
        while (left <= right) {
            while (arr[left] < pivot) left++;
            while (arr[right] > pivot) right--;

            if (left <= right) {
                int tmp = arr[left];
                arr[left] = arr[right];
                arr[right] = tmp;

                left++;
                right--;
            }
        }
        return left; // 次の分割点
    }
}
Java

実行例(例の配列 {5,3,8,1,4} のとき)

元の配列: [5, 3, 8, 1, 4]
バブルソート: [1, 3, 4, 5, 8]
選択ソート: [1, 3, 4, 5, 8]
クイックソート: [1, 3, 4, 5, 8]

解説まとめ

ソート種類特徴時間計算量
バブルソート簡単・交換多いO(n²)
選択ソート交換は少ないが比較が多いO(n²)
クイックソートとても速い。実用レベル平均 O(n log n)
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました