选择排序
选择排序是 时间复杂度的排序算法,那我们为什么要学习它呢?
因为它很基础,编码简单,易于实现,是一些简单情景的首选。
在一些特殊情况下,简单的排序算法更有效。
简单的排序算法思想衍生出复杂的排序算法,作为子过程,改进更复杂的排序算法。
排序流程
选择排序的思想,进行两次循环遍历。在内嵌遍历中,选择最小元素对应的索引,然后与外层遍历的元素作为交换,尽量把最小元素放在前面。
这样讲解十分空洞,下面配了一张图:
在外层第一次遍历中,当内层遍历完成后,我们发现 1 是最小值,对应索引是 4 ,然后与索引 0 进行交换。然后重复进入下一次的循环遍历。
如果还是觉得空洞,最好看着代码分析。
排序代码
private static void selectiveSort(int[] arr) {if (arr.length <= 1) {return;}int end = arr.length - 1;// 因为是两个下标对应的值做比较,左边下标i的取值范围只能是[0,end),左边下标不能取最后一个值for (int i = 0; i < end ; i++) {int minIndex = i;// j代表右边下标,取值范围是(i,end],因为要和i下标对应的值做比较,所以j下标始终要大于i下标,// 不能取第一个值,但是能取到最后一个值for (int j = i + 1; j <= end; j++) {// 左边下标的值大于右边下标的值,应该往数组的右边挪// 因为数组是一个一个地遍历,只需把最小索引下标与j交换即可if (arr[minIndex] > arr[j]) {minIndex = j;}}// 当前值和最小值进行交换swap(arr, i, minIndex);}}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
