-
选择排序思想
每一轮循环都选出数列中最小的值,然后直接交换到数列最左侧,重复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)
-
稳定性
选择排序算法不是稳定算法,稳定性算法就是:经过排序后,两个相等的元素位置不会发生改变。而选择排序过程中,每次都会选出一个最小值,然后交换到最左侧。所以两个相等的元素经过排序后是有可能发生改变的。所以它不是稳定的算法。
-
选择排序与冒泡排序比较
这种算法相对于冒泡排序的优点就是省去了多余的数据交换