「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。
前言
上一篇章使用了希尔排序分组思想来实现大数据量的插入排序,使得处理大数据量时速度很快,本章我们为大家讲解另一个排序他的特点比较薄弱,主要学习他的思想并且他是三大经典排序之一,也是初级程序员入门必学排序之一,他就是选择排序。
选择排序分析
选择排序复杂度: 时间复杂度平均为 O(n^2) 时间复杂度最坏情况下为O(n^2)与希尔和插入一样 时间复杂度最好为O(n^2) 空间复杂度为O(1) 稳定性为不稳定
通过上面的复杂度参数分析可以发现选择排序的时间复杂度并不优秀,都为O(n^2)对面前两天我们所讲述的排序中他目前是最拉跨的,但他的优点是实现简单,程序简单易懂。一般情况下并不推荐使用选择排序,初入门的程序员可以学习。
选择排序的排序过程
选择排序的主要思路为:首先会从头到尾每次去扫描序列,然后去找最小的元素,如果在过程中找到了一个小元素会先标记上,这是为了防止后面可能还有更小的,反正就是标记小的直到序列结束然后交换其位置,交换位置后从序列下一个开始循环,以此类推。弊端:这样其实会导致重复的比较从而增加无用的循环次数与比较次数,非常的耗时间。
选择排序代码实现
了解了思路后我们来实现代码这一块的逻辑:
@Test
public void selectionSort() {
for (int i = 0; i < arr.length; i++) {
int min = arr[i]; //最小值
int index = i; //最小下标
//寻找最小值然后记录位置
for (int j = i + 1; j < arr.length; j++) {
if (min < arr[j]) {
min = arr[j];
index = j;
}
}
//寻找到最小值位置后开始做交换
int temp = arr[i];
arr[i] = min;
arr[index] = temp;
}
System.out.println(getArr(arr));
}