前言基础:
1、选择排序的时间复杂度为O(n2),空间复杂度为O(1)。
2、选择排序是一个不稳定的排序算法。
3、每轮排序之后元素所在的位置就是其最终所在的位置。
选择排序的逻辑非常简单,只是每次选择最小的元素放在第i个位置上,循环不变量如下图:
public class SelectSort {
public SelectSort(){}
//arr[0,i]是有序的
public static <E extends Comparable<E>> void sort(E arr[]){
for (int i = 0; i < arr.length; i++) {
int minIndex=i;
for (int j = i+1; j < arr.length; j++) {
if (arr[j].compareTo(arr[minIndex])<0){
minIndex=j;
}
}
Util.swap(arr,i,minIndex);
}
}
//从后向前进行选择排序
public static <E extends Comparable<E>> void sort_reverse(E arr[]){
for (int i=arr.length-1;i>=0;i--){
int maxIndex=i;
for (int j=i;j>=0;j--){
if (arr[j].compareTo(arr[maxIndex])>0)
maxIndex=j;
}
Util.swap(arr,i,maxIndex);
}
}
}