关于选择排序,笔者认为选择排序是冒泡排序的逆过程。
-
选择排序的原理
-
首先在未排序的数组序列中找大最小的元素,存放在已排序序列的起始位置,然后,再从剩余的未排序元素中寻找最小元素,放到已排序的末尾。
-
关于未排序和已排序,笔者画了几张图便于读者理解。
-
-
手撕选择排序
-
先看代码,之后笔者在几个关键点,进行讲解便于记忆。
public static void sort(int[] arr) { // 参数检查 if(arr == null || arr.length < 2) return ; // 外层 for(int i = 0; i < arr.length - 1; i++) { // 记录一次遍历,最小值下标 int minIndex = i; // 内层 for(int j = i + 1; j < arr.length; j++) { minIndex = arr[minIndex] > arr[j] ? j : minIndex; } // 将小值,填入已排序数组 int tmp = arr[minIndex]; arr[minIndex] = arr[i]; arr[i] = tmp; } }
-
外层循环的作用:
-
范围:
arr.length - 1
,即初始下标为0元素默认最小。 -
每循环一次,已排序数组长度增加1。
-
比如,初始数组,[3,2,1,5,4]
-
-
内层循环的作用:
- 每一次,在未排序素组中寻找最小,更新当前最小值
minIndex
- 每一次,在未排序素组中寻找最小,更新当前最小值
-
-
选择排序的时间复杂度和稳定性分析
- 时间复杂度分析:
- 直接看循环,两次范围都是N,所以时间复杂度O(N * N)
- 跟冒泡类似,所有操作加起来是一个等差数列求和,去最高项得到O(N * N)
- 稳定性分析:
- 选择排序是不稳定算法。
- 比如,数组[5,8,5,2,6],第一次交换,会变成[2,8,5,5,6],两个5的相对位置改变,所有选择排序是不稳定的。
- 时间复杂度分析: