- 首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换),其次,在剩下的元素中找到最小元素,将它与数组的第二个元素交换位置。如此往复,知道整个数组排序,这种算法叫做选择排序,因为它在不断地选择剩余元素中的最小者。
- 交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是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);
}
}