选择排序

选择排序是 选择排序 - 图1时间复杂度的排序算法,那我们为什么要学习它呢?
因为它很基础,编码简单,易于实现,是一些简单情景的首选。
在一些特殊情况下,简单的排序算法更有效。
简单的排序算法思想衍生出复杂的排序算法,作为子过程,改进更复杂的排序算法。

排序流程

选择排序的思想,进行两次循环遍历。在内嵌遍历中,选择最小元素对应的索引,然后与外层遍历的元素作为交换,尽量把最小元素放在前面。
这样讲解十分空洞,下面配了一张图:
选择排序 - 图2
在外层第一次遍历中,当内层遍历完成后,我们发现 1 是最小值,对应索引是 4 ,然后与索引 0 进行交换。然后重复进入下一次的循环遍历。
如果还是觉得空洞,最好看着代码分析。

排序代码

  1. private static void selectiveSort(int[] arr) {
  2. if (arr.length <= 1) {
  3. return;
  4. }
  5. int end = arr.length - 1;
  6. // 因为是两个下标对应的值做比较,左边下标i的取值范围只能是[0,end),左边下标不能取最后一个值
  7. for (int i = 0; i < end ; i++) {
  8. int minIndex = i;
  9. // j代表右边下标,取值范围是(i,end],因为要和i下标对应的值做比较,所以j下标始终要大于i下标,
  10. // 不能取第一个值,但是能取到最后一个值
  11. for (int j = i + 1; j <= end; j++) {
  12. // 左边下标的值大于右边下标的值,应该往数组的右边挪
  13. // 因为数组是一个一个地遍历,只需把最小索引下标与j交换即可
  14. if (arr[minIndex] > arr[j]) {
  15. minIndex = j;
  16. }
  17. }
  18. // 当前值和最小值进行交换
  19. swap(arr, i, minIndex);
  20. }
  21. }
  22. private static void swap(int[] arr, int i, int j) {
  23. int temp = arr[i];
  24. arr[i] = arr[j];
  25. arr[j] = temp;
  26. }