时间复杂度O(N2)
选择排序的时间复杂度不会随着样本的改变而改变
说明
每次循环把最小的数选择出来放到前面。 选择排序每次选最小,冒泡排序每次选最大。 选择排序0~[n-1],1~[n-1], 2~[n-1]….最小的数每次放到前面 冒泡排序0~[n-1], 0~[n-2], 0~[n-3]…. 最大的数放后面
流程说明
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html 每次从m-n的位置上选择一个最小的数,和m位置的数进行交换,直到m==n。相当于是每次从剩余的数中选个最小的数放到最前面 [3, 5, 2, 7, 6]
idx 0 1 2 3 4
第一次: [0-4] 的位置上选一个最小的数,和[0]交换 n次看+比较
第二次: [1-4] 的位置上选一个最小的数,和[1]交换 n-1次看+比较
第二次: [2-4] 的位置上选一个最小的数,和[2]交换 n-2次看+比较
第二次: [3-4] 的位置上选一个最小的数,和[3]交换 n-3次看+比较 时间负责度:等差数列。等差数列 an平方+bn 冒泡排序在j和j+1上做比较和交换,选择排序从剩余的数中选出最小的,不用每次都交换
代码示例
package com.ss;import java.util.Arrays;import java.util.Random;/*** <p>* 选择排序* </P>** @author: zhangss* @since: 2021-01-04**/public class SelectionSort {/*** 选择排序* @param arr*/public static void selectionSort(int[] arr){for (int i = 0; i < arr.length; i++) {int minIdx = i;for (int j = i + 1; j < arr.length; j++) {if (arr[j] < arr[minIdx]){minIdx = j;}}if (i != minIdx) {swap(arr, i, minIdx);}}}/*** 交换两个位置的值* @param arr* @param i* @param j*/public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}/*** 对数器* 用来比较上述冒泡排序以后的顺序是否正确* @param arr1* @param arr2* @return*/public static boolean comparator(int[] arr1, int[] arr2){if(arr1.length != arr2.length){return false;}Arrays.sort(arr1);for (int i = 0; i < arr1.length; i++) {if(arr1[i] != arr2[i]){System.out.println(i + "..." + arr1[i]);System.out.println(i + "..." + arr2[i]);return false;}}return true;}/*** 产生数组用来测试冒泡排序方法* @return*/public static int[] getArr(){Random random = new Random();// 若电脑性能有限,生成的数组可以降低长度int length = random.nextInt(1000);int[] arr = new int[length];for(int i = 0; i < length; i++){arr[i] = random.nextInt(100);}return arr;}public static void main(String[] args) {// 循环测试5万次后,确定刚才写的排序没问题for (int i = 0; i < 50000; i++) {int arr1[] = getArr();int arr2[] = Arrays.copyOf(arr1, arr1.length);selectionSort(arr2);boolean comparator = comparator(arr1, arr2);if(!comparator){System.out.println(Arrays.toString(arr1));System.out.println(Arrays.toString(arr2));System.out.println("排序失败");}}}}
