•  选择排序思想

每一轮循环都选出数列中最小的值,然后直接交换到数列最左侧,重复n-1次循环得到一个有序数组。

  比如:int arr[] = {5,8,6,9,3,7,4,2,1};这个数组
  第一轮比较:选择出数组中最小值元素1,让其与数组最左侧元素5进行交换,得到数组{1,8,6,9,3,7,4,2,5}。此时数组中有序区{1},无序区{8,6,9,3,7,4,2,5}
  第二轮比较:选择出数组无序区中最小值元素2,与数组无序区最左侧元素8进行交换,得到数组{1,2,6,9,3,7,4,8,5}。此时数组中有序区{1,2},无序区{6,9,3,7,4,8,5}
  第三轮比较:选择出数组无序区中最小值元素3,与数组无序区最左侧元素6进行交换,得到数组{1,2,3,9,6,7,4,8,5}。此时数组中有序区{1,2,3},无序区{9,6,7,4,8,5}
  ............
  第八轮比较:选择出数组无序区中最小值元素8,与数组无序区最左侧元素9进行交换,得到数组{1,2,3,4,5,6,7,8,9}。此时数组已然是有序的了,排序完成
  • 实现代码

 1 public class SelectionSort {
 2 
 3     // 思想:每一轮选出最小值,直接交换到最左侧
 4     // 这种排序最大的好处是:少了很多多余的元素交换
 5     public static int[] selectionSort(int[] arr) {
 6         for (int i = 0; i < arr.length - 1; i++) {
 7             int minIndex = i;
 8             for (int j = i + 1; j < arr.length; j++) {
 9                 minIndex = arr[minIndex] < arr[j] ? minIndex : j;
10             }
11             int temp = arr[minIndex];
12             arr[minIndex] = arr[i];
13             arr[i] = temp;
14         }
15         return arr;
16     }
17 
18     public static void main(String[] args) {
19         int[] arr = {5, 8, 6, 3, 9, 2, 1, 7};
20         System.out.println(Arrays.toString(selectionSort(arr)));
21     }
22 }
  • 时间复杂度和空间复杂度

  时间复杂度为O(n²),由于没有额外占用空间所以空间复杂度为O(1)

  • 稳定性

  选择排序算法不是稳定算法,稳定性算法就是:经过排序后,两个相等的元素位置不会发生改变。而选择排序过程中,每次都会选出一个最小值,然后交换到最左侧。所以两个相等的元素经过排序后是有可能发生改变的。所以它不是稳定的算法。

  • 选择排序与冒泡排序比较

  这种算法相对于冒泡排序的优点就是省去了多余的数据交换

 

posted on 2020-04-09 18:02  Hush!  阅读(208)  评论(0编辑  收藏  举报