概念介绍
有同学想了解选择排序,今天它来了!选择排序的核心思想是:从待排序的数据中选出最小的元素放在起始位置,然后再从剩余的未排序元素中寻找到最小的元素,放到已排序的序列的末尾!其时间复杂度为O(n²)。
还是用栗子来说明大家会更容易理解一些:咱们要对[2,7,-5,30,9]这五个数使用选择排序进行排序。
初始序列:[2,7,-5,30,9],使用min记录最小值,minIndex记录最小值的下标。
第一轮:我们的目标是找到最小的数,放到第一位。
第一次:默认第一的元素为最小值,即min=2,minIndex=0,[2,7,-5,30,9],比较当前最小值2与7,7比2大,不做任何操作。
第二次:[2,7,-5,30,9],比较当前最小值2与-5,2比-5大,此时最小值应该发生改变,即修改min=-5,minIndex=2。
第三次:[2,7,-5,30,9],比较当前最小值-5与30,,30比-5大,所以不做操作。
第四次:[2,7,-5,30,9],比较当前最小值-5与9,9比-5大,同样不做任何操作。
第一轮结束后,我们找出当前的最小值及最小值下标min=-5,minIndex=2,这时候,我们将-5与2进行交换,完成第一轮遍历操作,交换后序列为:[-5,7,2,30,9]
第二轮:我们的目标是,找出除了-5以外的最小值,让它排在第2位,Let's go!
第一次:默认除了-5外的第一个元素为最小值,即min=7,minIndex=1,[-5,7,2,30,9],比较当前最小值7与2,7比2大,此时最小值应该发生改变,即修改min=2,minIndex=2。
第二次:[-5,7,2,30,9],比较当前最小值2与30,,30比2大,所以不做操作。
第三次:[-5,7,2,30,9],比较当前最小值2与9,9比7大,同样不做任何操作。
第二轮结束后,我们找到了除了-5以外的最小值2,同样的,让7与2进行交换,完成第二轮遍历操作,交换后序列为:[-5,2,7,30,9]。
第三轮:我们的目标是,找出除了2以外的最小值,让它排在第3位。
第一次:默认除了2外的第一个元素为最小值,即min=7,minIndex=2,[-5,2,7,30,9],比较当前最小值7与30,30比9大,所以不做操作。
第二次:[-5,2,7,30,9],比较当前最小值2与9,9比7大,同样不做任何操作。
第三轮结束后,我们发现min=7,minIndex=2,刚好序列的第三位7,所以同样不需要做任何操作。
第四轮:我们的目标是,找出除了7以外的最小值,让它排在第4位。
第一次:默认除了7外的第一个元素为最小值,即min=30,minIndex=3,[-5,2,7,30,9],比较当前最小值30与9,30比9大,此时最小值应该发生改变,即修改min=9,minIndex=4。
第四轮结束后,我们找到了除了7以外的最小值9,同样的,让30与9进行交换,交换后序列为[-5,2,7,9,30],此时排序完成。
代码实现
只要理解了排序的思路,代码的实现就很简单了!
1 public static void selectSort(int[] arr) { 2 // 遍历从数组的第一位开始 3 for (int i = 0; i < arr.length - 1; i++) { 4 // 每轮遍历开始前,默认第一个数为最小值 5 int min = arr[i]; 6 // 同时记住最小值的下标 7 int minIndex = i; 8 for (int j = i + 1; j < arr.length; j++) { 9 // 通过对比找出最小值 10 if (min > arr[j]) { 11 min = arr[j]; 12 minIndex = j; 13 } 14 } 15 if (minIndex != i) { 16 // 每轮结束后,将头结点与最小值进行交换 17 arr[minIndex] = arr[i]; 18 arr[i] = min; 19 } 20 } 21 }
至此,代码编写完成,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具体实现位于algorithm工程下的sort目录SelectSort,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多排序算法!