1. 选择排序的定义
找出数组最小的元素跟左边第一个元素位置进行交换。然后再从剩下的数组元素中找出最小的位置,跟左边第二个元素位置进行交换。 如此反复,直到将整个数组排序。 执行轨迹如下:
array: [2, 1, 6, 8, 3]
第1次执行:minPosition = 0遍历选择后的结果[1, 2, 6, 8, 3]
第2次执行:minPosition = 1遍历选择后的结果[1, 2, 6, 8, 3]
第3次执行:minPosition = 3遍历选择后的结果[1, 2, 3, 8, 6]
...
第n次执行:minPosition = n-1遍历选择后的结果[1, 2, 3, 6, 8]
2. 代码实现
public class Selection extends SortBase {
public static void main(String[] args) {
Comparable[] a = new Comparable[] {2, 1, 6, 8, 3};
sort(a);
System.out.print("排序结果:");
show(a);
showLessAndExchCount(a);
}
public static void sort(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
int min = i;
for (int j = i + 1; j < a.length; j++) {
if (less(a[j], a[min])) {
min = j;
}
}
exch(a, i, min);
System.out.print("第"+(i+1)+"次选择排序后:");
show(a);
}
}
}
运行结果如下:
第1次选择排序后:1 2 6 8 3
第2次选择排序后:1 2 6 8 3
第3次选择排序后:1 2 3 8 6
第4次选择排序后:1 2 3 6 8
第5次选择排序后:1 2 3 6 8
排序结果:1 2 3 6 8
排序元素个数:5, 比较次数:10, 交换次数:5
3. tradeoff
- 运行时间跟输入的数组元素无关
- 移动数据最少
4. 复杂的分析
- 比较次数是n^2/2
- 交换次数是n