选择排序的原理
1、首先,找到数组中最小的那个元素,
2、其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。
3、再次,在剩下的元素中找到最小的元素,将它与数组中的第二个元素交换位置。如此往复,知道将整个数组排序
它在不断地选择剩余元素之中的最小者
该算法将第i小的元素放在a[i]之中,数组的第i个位置的左边是i个最小的元素且它们不会被访问
选择排序的内循环只是在比较当前元素与目前已知的最小元素(以及将当前索引加1和检查是否代码越界)。 交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是N。所以算法的时间效率取决于比较的次数
选择排序的特点
1、运行时间与输入无关
为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息。
一个已经有序的数组或是主键全部相等的数组和一个元素随机排序的数组所用的排序时间竟然一样长。
2、数据移动是最少的
每次交换都会改变两个数组元素的值,因此选择排序用了N次交换-交换次数和数组的大小是线性关系的。
public class Selection {
public static void sort(Comparable[] a){
//将a[]按升序排列
int N = a.length; //数组长度
for(int i = 0; i < N; i++){
int min = i;
for(int j = i+1; j < N; j++){
if(less(a[j],a[min])) min = j;
}
exch(a, i , min);
}
}
private static boolean less(Comparable v, Comparable m){
return v.compareTo(m) < 0;
}
private static void exch(Comparable[] a, int i, int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
private static boolean isSorted(Comparable[] a){
for(int i = 1; i < a.length; i++){
if(less(a[i],a[i-1])) return false;
}
return true;
}
private static void show(Comparable[] a){
for(int i = 0; i < a.length; i++){
StdOut.print(a[i]+" "); //输出
}
StdOut.println();
}
public static void main(String[] args) {
String[] a = {"S","O","R","T","E","X","A","M","P","L","E"};
sort(a);
assert isSorted(a);
show(a);
}
}