五、简单选择排序(Select Sort)
1、概念
从排序序列的待确认元素索引位置开始比较,从前往后,找到最小值(正序),整个排序序列比较完成后,可以确认一个最值,与开始比较的索引值进行交换。反复比较,实现最终排序。
简单选择排序属于选择排序
的一种。
2、过程
-
两层嵌套循环。
-
外层循环,用于表示是第几次比较,排序完成,需要比较排序序列元素个数次。
用一个临时变量记录本次比较的起始下标,再用一个临时变量记录本次比较的起始下标对应的元素值。
-
内层循环,用于比较两个元素的大小,从本次查找的起始下标的下一个位置开始查找,直到排序序列的尾部为止。如果发现了较小的元素(正序),则更新记录下标值。
内层循环完毕,判断下标值是否被改变过,如果改变过,则交换下标元素和起始元素的值。
3、示例
正序
public void selectSort(int[] array) {
for (int i = 0, len = array.length; i < len - 1; i++) {
int index = i;
int element = array[index];
for (int j = index + 1; j < len; j++) {
if (element > array[j]) {
index = j;
element = array[j];
}
}
if (index != i) {
array[index] = array[i];
array[i] = element;
}
}
}
倒序
public void selectSort(int[] array) {
for (int i = 0, len = array.length; i < len - 1; i++) {
int index = i;
int element = array[index];
for (int j = index + 1; j < len; j++) {
if (element < array[j]) { // 倒序
index = j;
element = array[j];
}
}
if (index != i) {
array[index] = array[i];
array[i] = element;
}
}
}
4、性能
- 时间复杂度:平均时间复杂度
O(n²)
,最坏时间复杂度O(n²)
- 空间复杂度:
O(1)
- 稳定性:不稳定(a=b,排序前a在b的前面,排序后a不一定还在b的前面)