算法描述
- 假设开始有一个有序列表,和一个无序列表。有序列表中有零个元素,无序列表中的元素个数等于待排序列表的总长。
- 取无序列表中的最小值与无序列表中的第一个元素交换。再将无序列表第一个元素并入有序列表的最后一个元素。此时,有序列表长度加一,无序列表长度减一。
- 依此类推,无序列表不断缩短,直至排序结束。
这种方法叫做选择排序,因为它在不断地选择剩余元素中的最小者。
(以上方法实现正序排序)
特点
-
运行时间和输入无关。为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息。这个性质在某些情况下是缺点,因为使用选择排序时,一个已经有序的列表或是主键全部相等的列表和一个元素随机排列的列表所用的排序时间一样长。
-
数据移动是最少的。每次交换都会改变两个列表元素的值,因此选择排序用了N次交换——交换次数和列表大小是线性关系。
算法实现
/**
* Java 实现正序排序 int 类型数组
*/
public class Selection {
public static void sort(int[] a) {
for (int i = 0; i < a.length; i++) {
int min = i;
for (int j = i+1; j < a.length; j++) {
if (a[j] < a[min]) {
min = j;
}
}
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
过程模拟
i |
min |
0 |
1 |
2 |
3 |
4 |
5 |
|
|
S |
O |
R |
T |
I |
T |
0 |
4 |
S |
O |
R |
T |
>> I << |
T |
1 |
1 |
I |
>> O << |
R |
T |
S |
T |
2 |
2 |
I |
O |
>> R << |
T |
S |
T |
3 |
4 |
I |
O |
R |
T |
>> S << |
T |
4 |
4 |
I |
O |
R |
S |
>> T << |
T |
5 |
5 |
I |
O |
R |
S |
T |
>> T << |
|
|
I |
O |
R |
S |
T |
T |