• 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)


    1. 插入排序(insertion-sort):

                                              是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入

        算法稳定性:

                            对于两个相同的数,经过排序后,他们依旧保持之前的顺序,二者次序没有发生变化。插入排序是算法稳定的

       时间复杂度

            最优情况

                          在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为O(n)

            最坏情况

                              最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(n_{}^{2}

         动态图

      递归代码:

    1. package com.nami.algorithm.study.day06;
    2. import java.util.Arrays;
    3. /**
    4. * beyond u self and trust u self.
    5. *
    6. * @Author: lbc
    7. * @Date: 2023-09-05 15:36
    8. * @email: 594599620@qq.com
    9. * @Description: keep coding
    10. */
    11. public class InsertionSort {
    12. /**
    13. * 插入排序:
    14. * 从右向左找
    15. *
    16. * @param target
    17. */
    18. public static void sort(int[] target) {
    19. insertion(target, 1);
    20. }
    21. /**
    22. * 递归 缩小结果集
    23. *
    24. * @param target
    25. * @param lowIndex
    26. */
    27. private static void insertion(int[] target, int lowIndex) {
    28. if (lowIndex == target.length) {
    29. return;
    30. }
    31. int t = target[lowIndex];
    32. // 已排序区域指针
    33. int i = lowIndex - 1;
    34. // 没有找到插入位置
    35. while (i >= 0 && target[i] > t) {
    36. target[i + 1] = target[i];
    37. i--;
    38. // 如果到达数组0时候 依旧没有找到,则退出循环
    39. // 抽出,合并到while内
    40. // if(i < 0) {
    41. // break;
    42. // }
    43. }
    44. //插入位置找到了
    45. // 优化减少不必要的赋值动作,
    46. // 需要替换的数组值,正好是大于i, i+1索引的值不需要动,这个赋值动作就不必要了
    47. if (i + 1 != lowIndex) {
    48. target[i + 1] = t;
    49. }
    50. insertion(target, lowIndex + 1);
    51. }
    52. /**
    53. * 两种写法,这种赋值次数更多
    54. * 时间复杂度相同
    55. * 但是 效率没有上面的高,消耗在更多的赋值操作上了
    56. *
    57. * @param target
    58. * @param lowIndex
    59. */
    60. private static void insertion0(int[] target, int lowIndex) {
    61. if (lowIndex == target.length) {
    62. return;
    63. }
    64. // 已排序区域指针
    65. int i = lowIndex - 1;
    66. // 没有找到插入位置
    67. while (i >= 0 && target[i] > target[i + 1]) {
    68. int temp = target[i];
    69. target[i] = target[i + 1];
    70. target[i + 1] = temp;
    71. i--;
    72. }
    73. insertion(target, lowIndex + 1);
    74. }
    75. public static void main(String[] args) {
    76. int[] test = new int[]{1, 54, 234, 675, 32432, 23, 78, 459, 354, 9, 344, 22, 46, 85, 236, 3278, 245, 83, 154, 2, 1, 34, 73, 23};
    77. int[] test2 = new int[]{2, 4, 7, 3, 2, 1};
    78. // sort(test, test.length);
    79. sort(test);
    80. System.out.println(Arrays.toString(test));
    81. }
    82. }

  • 相关阅读:
    React-hook-form-mui(一):基本使用
    零极点分析
    使用正则表达式批量修改函数
    Unity实现设计模式——状态模式
    【设计模式】Java设计模式 - 模板模式
    VM装Windows虚拟机扩容
    前缀表达式
    go-zero 是如何实现令牌桶限流的?
    Linux内核——门相关入门知识
    可能会用到软件和服务通过scoop一键安装
  • 原文地址:https://blog.csdn.net/qq_33919114/article/details/132707019