- 首先,找到陣列中最小的那個元素,其次,將它和陣列的第一個元素交換位置(如果第一個元素就是最小元素那麼它就和自己交換),其次,在剩下的元素中找到最小元素,將它與陣列的第二個元素交換位置。如此往復,知道整個陣列排序,這種演算法叫做選擇排序,因為它在不斷地選擇剩餘元素中的最小者。
- 交換元素的程式碼寫在內迴圈之外,每次交換都能排定一個元素,因此交換的總次數是n,所以演算法的時間效率取決於比較的次數。
- 對於長度為n的陣列,選擇排序需要大約n²/2次比較和n次交換。
- 特點:
1.執行時間和輸入無關。一個已經排序的陣列和一個元素隨機排列的陣列所用的排序時間一樣長。
2.資料移動最少。n次交換,其他演算法不具備這個特徵。
public class Selection {
public static Comparable[] sort(Comparable[] a) {
int n = a.length;
for (int i = 0; i < n; i++) {
int min = i;
for (int j = i + 1; j < n; j++) {
if (Example.less(a[j], a[min])) {
min = j;
}
}
Example.exchange(a, i, min);
}
return a;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(sort(new Integer[] {2, 6, 1, 8, 9})));
}
}
public class Example {
public static void sort(Comparable[] a) {
}
public static boolean less(Comparable v, Comparable w) {
return (v.compareTo(w) < 0);
}
public static void exchange(Comparable[] a, int i, int j) {
Comparable swap = a[i];
a[i] = a[j];
a[j] = swap;
}
public static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
StdOut.print(a[i] + " ");
}
StdOut.println();
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i - 1])) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String[] a = In.readStrings();
sort(a);
assert isSorted(a);
show(a);
}
}