明解 Javaによるアルゴリズムとデータ構造 6-3_単純選択ソート
6-3 単純選択ソート straight selection sort
最小要素を先頭に、2番めに小さい要素を先頭から2番目に移動する、を繰り返すアルゴリズム
- 未ソート部から最小のキーを持つ a[min] を選択
- a[min] と、未ソート部の先頭要素を交換
- 離れた要素を交換する可能性があるため、安定ではない
- 比較回数 :
- 1パスにつき、最小要素1つに、その他の要素を n - (現パス数) 回ぶつけて最小判定。それを n - 1 パス実施
ソースコード(途中経過表示板)
import java.util.Scanner; class SelectionSort { static void swap(int[] a, int idx1, int idx2) { int t = a[idx1]; a[idx1] = a[idx2]; a[idx2] = t; } static void selectionSort(int[] a, int n) { for (int i = 0; i < n - 1; i++) { System.out.println("パス: " + (i + 1)); int min = i; for (int j = i + 1; j < n; j++) { // j -> 交換検討対象のインデックス if (a[j] < a[min]) { // ソート前状態の表示 for (int k = 0; k < n; k++) { if (k == min) { System.out.printf("%2d* ", a[k]); // "*" -> 現時点での最小要素 } else if (k == j) { System.out.printf("%2d+ ", a[k]); // "+" -> 比較の結果新たに最小となった要素 } else { System.out.printf("%2d ", a[k]); } } System.out.println(); min = j; } else { // ソート前状態の表示 for (int k = 0; k < n; k++) { if (k == min) { System.out.printf("%2d* ", a[k]); } else if (k == j) { System.out.printf("%2d- ", a[k]); // "-" -> 比較の結果最小にならなかった要素 } else { System.out.printf("%2d ", a[k]); } } System.out.println(); } } swap(a, i, min); // ソート後状態の表示 for (int e : a) { System.out.printf("%2d ", e); } System.out.println(); } } public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.println("単純選択ソート"); System.out.print("要素数: "); int nx = stdIn.nextInt(); ; int[] x = new int[nx]; for (int i = 0; i < nx; i++) { System.out.println("x[" + i + "]:"); x[i] = stdIn.nextInt(); } selectionSort(x, nx); System.out.println("昇順にソートしました"); for (int i = 0; i < nx; i++) { System.out.println("x[" + i + "] = " + x[i]); } } }
単純選択ソート 要素数: 4 x[0]: 4 x[1]: 3 x[2]: 2 x[3]: 1 パス: 1 4* 3+ 2 1 4 3* 2+ 1 4 3 2* 1+ 1 3 2 4 パス: 2 1 3* 2+ 4 1 3 2* 4- 1 2 3 4 パス: 3 1 2 3* 4- 1 2 3 4 昇順にソートしました x[0] = 1 x[1] = 2 x[2] = 3 x[3] = 4

- 作者: 柴田望洋
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2007/11/07
- メディア: 単行本
- 購入: 5人 クリック: 42回
- この商品を含むブログ (19件) を見る