zcq

    1. package com.atguigu.sort;
    2. import java.text.SimpleDateFormat;
    3. import java.util.Arrays;
    4. import java.util.Date;
    5. public class InsertSort {
    6. public static void main(String[] args) {
    7. //int[] arr = {101, 34, 119, 1, -1, 89};
    8. // 创建要给80000个的随机的数组
    9. int[] arr = new int[80000];
    10. for (int i = 0; i < 80000; i++) {
    11. arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
    12. }
    13. System.out.println("插入排序前");
    14. Date data1 = new Date();
    15. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    16. String date1Str = simpleDateFormat.format(data1);
    17. System.out.println("排序前的时间是=" + date1Str);
    18. insertSort(arr); //调用插入排序算法
    19. Date data2 = new Date();
    20. String date2Str = simpleDateFormat.format(data2);
    21. System.out.println("排序前的时间是=" + date2Str);
    22. //System.out.println(Arrays.toString(arr));
    23. }
    24. //插入排序
    25. public static void insertSort(int[] arr) {
    26. int insertVal = 0;
    27. int insertIndex = 0;
    28. //使用for循环来把代码简化
    29. for(int i = 1; i < arr.length; i++) {
    30. //定义待插入的数
    31. insertVal = arr[i];
    32. insertIndex = i - 1; // 即arr[1]的前面这个数的下标
    33. // 给insertVal 找到插入的位置
    34. // 说明
    35. // 1. insertIndex >= 0 保证在给insertVal 找插入位置,不越界
    36. // 2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
    37. // 3. 就需要将 arr[insertIndex] 后移
    38. while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
    39. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
    40. insertIndex--;
    41. }
    42. // 当退出while循环时,说明插入的位置找到, insertIndex + 1
    43. // 举例:理解不了,我们一会 debug
    44. //这里我们判断是否需要赋值
    45. if(insertIndex + 1 != i) {
    46. arr[insertIndex + 1] = insertVal;
    47. }
    48. //System.out.println("第"+i+"轮插入");
    49. //System.out.println(Arrays.toString(arr));
    50. }
    51. /*
    52. //使用逐步推导的方式来讲解,便利理解
    53. //第1轮 {101, 34, 119, 1}; => {34, 101, 119, 1}
    54. //{101, 34, 119, 1}; => {101,101,119,1}
    55. //定义待插入的数
    56. int insertVal = arr[1];
    57. int insertIndex = 1 - 1; //即arr[1]的前面这个数的下标
    58. //给insertVal 找到插入的位置
    59. //说明
    60. //1. insertIndex >= 0 保证在给insertVal 找插入位置,不越界
    61. //2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
    62. //3. 就需要将 arr[insertIndex] 后移
    63. while(insertIndex >= 0 && insertVal < arr[insertIndex] ) {
    64. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
    65. insertIndex--;
    66. }
    67. //当退出while循环时,说明插入的位置找到, insertIndex + 1
    68. //举例:理解不了,我们一会 debug
    69. arr[insertIndex + 1] = insertVal;
    70. System.out.println("第1轮插入");
    71. System.out.println(Arrays.toString(arr));
    72. //第2轮
    73. insertVal = arr[2];
    74. insertIndex = 2 - 1;
    75. while(insertIndex >= 0 && insertVal < arr[insertIndex] ) {
    76. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
    77. insertIndex--;
    78. }
    79. arr[insertIndex + 1] = insertVal;
    80. System.out.println("第2轮插入");
    81. System.out.println(Arrays.toString(arr));
    82. //第3轮
    83. insertVal = arr[3];
    84. insertIndex = 3 - 1;
    85. while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
    86. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
    87. insertIndex--;
    88. }
    89. arr[insertIndex + 1] = insertVal;
    90. System.out.println("第3轮插入");
    91. System.out.println(Arrays.toString(arr)); */
    92. }
    93. }