时间复杂度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("排序失败");
}
}
}
}