• 算法 数据结构 递归插入排序 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. }

  • 相关阅读:
    JDK8的特性
    一般将来时练习题
    redis-安装配置
    Mybatis-Plus官方分库分表神器,一个依赖轻松搞定!
    递归--回溯法--N皇后问题
    Unity笔记(10):SHOOT GAME EXAMPLE【2D】
    部署Kafka
    用自己的编程语言实现了一个网站(增强版)
    java毕业生设计高校固定资产采购预算申报系统计算机源码+系统+mysql+调试部署+lw
    条件欧几里得聚类
  • 原文地址:https://blog.csdn.net/qq_33919114/article/details/132707019