算法中的重要思想: 先简单,后复杂

    1. package com.atguigu.sort;
    2. /**
    3. * ClassName: <br/>
    4. * Description: <br/>
    5. * Date: 2021-02-22 16:06 <br/>
    6. * @project data_algorithm
    7. * @package com.atguigu.sort
    8. */
    9. import java.text.SimpleDateFormat;
    10. import java.util.Arrays;
    11. import java.util.Date;
    12. //选择排序
    13. public class SelectSort {
    14. public static void main(String[] args) {
    15. //int [] arr = {101, 34, 119, 1, -1, 90, 123};
    16. //创建要给80000个的随机的数组
    17. int[] arr = new int[80000];
    18. for (int i = 0; i < 80000; i++) {
    19. arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
    20. }
    21. System.out.println("排序前");
    22. //System.out.println(Arrays.toString(arr));
    23. Date data1 = new Date();
    24. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS");
    25. String date1Str = simpleDateFormat.format(data1);
    26. System.out.println("排序前的时间是=" + date1Str);
    27. selectSort(arr);
    28. Date data2 = new Date();
    29. String date2Str = simpleDateFormat.format(data2);
    30. System.out.println("排序前的时间是=" + date2Str);
    31. //System.out.println("排序后");
    32. //System.out.println(Arrays.toString(arr));
    33. }
    34. //选择排序
    35. public static void selectSort(int[] arr) {
    36. //在推导的过程,我们发现了规律,因此,可以使用for来解决
    37. //选择排序时间复杂度是 O(n^2)
    38. for (int i = 0; i < arr.length - 1; i++) {
    39. int minIndex = i;
    40. int min = arr[i];
    41. for (int j = i + 1; j < arr.length; j++) {
    42. if (min > arr[j]) { // 说明假定的最小值,并不是最小
    43. min = arr[j]; // 重置min
    44. minIndex = j; // 重置minIndex
    45. }
    46. }
    47. // 将最小值,放在arr[0], 即交换
    48. if (minIndex != i) {
    49. arr[minIndex] = arr[i];
    50. arr[i] = min;
    51. }
    52. //System.out.println("第"+(i+1)+"轮后~~");
    53. //System.out.println(Arrays.toString(arr));// 1, 34, 119, 101
    54. }
    55. /*
    56. //使用逐步推导的方式来,讲解选择排序
    57. //第1轮
    58. //原始的数组 : 101, 34, 119, 1
    59. //第一轮排序 : 1, 34, 119, 101
    60. //算法 先简单--》 做复杂, 就是可以把一个复杂的算法,拆分成简单的问题-》逐步解决
    61. //第1轮
    62. int minIndex = 0;
    63. int min = arr[0];
    64. for(int j = 0 + 1; j < arr.length; j++) {
    65. if (min > arr[j]) { //说明假定的最小值,并不是最小
    66. min = arr[j]; //重置min
    67. minIndex = j; //重置minIndex
    68. }
    69. }
    70. //将最小值,放在arr[0], 即交换
    71. if(minIndex != 0) {
    72. arr[minIndex] = arr[0];
    73. arr[0] = min;
    74. }
    75. System.out.println("第1轮后~~");
    76. System.out.println(Arrays.toString(arr));// 1, 34, 119, 101
    77. //第2轮
    78. minIndex = 1;
    79. min = arr[1];
    80. for (int j = 1 + 1; j < arr.length; j++) {
    81. if (min > arr[j]) { // 说明假定的最小值,并不是最小
    82. min = arr[j]; // 重置min
    83. minIndex = j; // 重置minIndex
    84. }
    85. }
    86. // 将最小值,放在arr[0], 即交换
    87. if(minIndex != 1) {
    88. arr[minIndex] = arr[1];
    89. arr[1] = min;
    90. }
    91. System.out.println("第2轮后~~");
    92. System.out.println(Arrays.toString(arr));// 1, 34, 119, 101
    93. //第3轮
    94. minIndex = 2;
    95. min = arr[2];
    96. for (int j = 2 + 1; j < arr.length; j++) {
    97. if (min > arr[j]) { // 说明假定的最小值,并不是最小
    98. min = arr[j]; // 重置min
    99. minIndex = j; // 重置minIndex
    100. }
    101. }
    102. // 将最小值,放在arr[0], 即交换
    103. if (minIndex != 2) {
    104. arr[minIndex] = arr[2];
    105. arr[2] = min;
    106. }
    107. System.out.println("第3轮后~~");
    108. System.out.println(Arrays.toString(arr));// 1, 34, 101, 119 */
    109. }
    110. }

    选择排序就是不断找剩下部分数组的最小值的过程