首页 > 技术文章 > 选择排序

maguanyue 2019-09-25 17:06 原文

概念介绍

  有同学想了解选择排序,今天它来了!选择排序的核心思想是:从待排序的数据中选出最小的元素放在起始位置,然后再从剩余的未排序元素中寻找到最小的元素,放到已排序的序列的末尾!其时间复杂度为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,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多排序算法!

推荐阅读