时间复杂度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上做比较和交换,选择排序从剩余的数中选出最小的,不用每次都交换

代码示例

  1. package com.ss;
  2. import java.util.Arrays;
  3. import java.util.Random;
  4. /**
  5. * <p>
  6. * 选择排序
  7. * </P>
  8. *
  9. * @author: zhangss
  10. * @since: 2021-01-04
  11. **/
  12. public class SelectionSort {
  13. /**
  14. * 选择排序
  15. * @param arr
  16. */
  17. public static void selectionSort(int[] arr){
  18. for (int i = 0; i < arr.length; i++) {
  19. int minIdx = i;
  20. for (int j = i + 1; j < arr.length; j++) {
  21. if (arr[j] < arr[minIdx]){
  22. minIdx = j;
  23. }
  24. }
  25. if (i != minIdx) {
  26. swap(arr, i, minIdx);
  27. }
  28. }
  29. }
  30. /**
  31. * 交换两个位置的值
  32. * @param arr
  33. * @param i
  34. * @param j
  35. */
  36. public static void swap(int[] arr, int i, int j) {
  37. int temp = arr[i];
  38. arr[i] = arr[j];
  39. arr[j] = temp;
  40. }
  41. /**
  42. * 对数器
  43. * 用来比较上述冒泡排序以后的顺序是否正确
  44. * @param arr1
  45. * @param arr2
  46. * @return
  47. */
  48. public static boolean comparator(int[] arr1, int[] arr2){
  49. if(arr1.length != arr2.length){
  50. return false;
  51. }
  52. Arrays.sort(arr1);
  53. for (int i = 0; i < arr1.length; i++) {
  54. if(arr1[i] != arr2[i]){
  55. System.out.println(i + "..." + arr1[i]);
  56. System.out.println(i + "..." + arr2[i]);
  57. return false;
  58. }
  59. }
  60. return true;
  61. }
  62. /**
  63. * 产生数组用来测试冒泡排序方法
  64. * @return
  65. */
  66. public static int[] getArr(){
  67. Random random = new Random();
  68. // 若电脑性能有限,生成的数组可以降低长度
  69. int length = random.nextInt(1000);
  70. int[] arr = new int[length];
  71. for(int i = 0; i < length; i++){
  72. arr[i] = random.nextInt(100);
  73. }
  74. return arr;
  75. }
  76. public static void main(String[] args) {
  77. // 循环测试5万次后,确定刚才写的排序没问题
  78. for (int i = 0; i < 50000; i++) {
  79. int arr1[] = getArr();
  80. int arr2[] = Arrays.copyOf(arr1, arr1.length);
  81. selectionSort(arr2);
  82. boolean comparator = comparator(arr1, arr2);
  83. if(!comparator){
  84. System.out.println(Arrays.toString(arr1));
  85. System.out.println(Arrays.toString(arr2));
  86. System.out.println("排序失败");
  87. }
  88. }
  89. }
  90. }