选择排序
选择排序: 首先找到数组中最小的元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么就与它自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这就是选择排序,因为它在不断的选择剩余元素中最小的。
结论: 对于长度为N的数组,选择排序需要大约N2/2次比较和N次交换。
特点:
- 运行时间与输入无关。为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息。这种性质在某些情况下是缺点,因为使用选择排序的人可能会惊讶的发现,一个已经有序的数组或是主键全部相等的数组和一个元素随机排列的数组所用的排序时间一样长。
- 数据移动是最少的。每次交换都会改变两个数组的元素的值,因此选择排序用了N次交换——交换次数和数组的大小呈线性关系。
1 public static void sort(Comparable[] a) {
2 //将a按升序排列
3 int L = a.length;
4 for (int i = 0; i < L; i++) {
5 //最小值的下标初始为i
6 int min = i;
7 for (int j = i + 1; j < L; j++) {
8 //比较大小
9 if (a[min].compareTo(a[j]) > 0) {
10 //将最小值的下标赋给min
11 min = j;
12 }
13 }
14 //将最小值的下标和“i”换位(最小值换位)
15 exch(a, i, min);
16 }
17
18 }