• 插入排序与希尔排序


    个人主页:Lei宝啊

    愿所有美好如期而遇


    前言:

    这两个排序在思路上有些相似,所以有人觉得插入排序和希尔排序差别不大,事实上,他们之间的差别不小,插入排序只是希尔排序的最后一步。


    目录

    前言:

    插入排序:

    思路:

    图解:

    代码:

    希尔排序:

    思路:

    图解:

    代码:


    插入排序:

    思路:

    当我们有了一个有序的数组arr,假设为升序,现在向里面插入一个新数据。

    我们假设这个数组有n个元素,最后一个元素的下标我们记作end,那么要插入的这个数下标为end+1,并用tmp记下这个数的大小。

    接下来,如果tmp小于arr[end],那么arr[end+1] = arr[end];  end--,

                  如果tmp大于等于arr[end],那么break;   arr[end+1] = tmp;  

    重复上述操作,直到end < 0或者break跳出


    那么面对一个无序的数组,我们可以将第一个元素当做有序,第二个元素为新插入元素,依次类推排序

    图解:

    代码:

    1. void InsertSort(int* arr, int n)
    2. {
    3. //i == n - 2时,temp = arr[n - 1];
    4. for (int i = 0; i < n - 1; i++)
    5. {
    6. int end = i;
    7. int temp = arr[end + 1];
    8. //此处画个图,end小于0跳出循环
    9. while (end >= 0)
    10. {
    11. if (temp < arr[end])
    12. {
    13. //插入的值比end小,end值向后移动一位
    14. arr[end + 1] = arr[end];
    15. end--;
    16. }
    17. else
    18. {
    19. break;
    20. }
    21. }
    22. //写在循环外的原因是如果while循环不是break出来的
    23. //会导致第一个元素值重复,插入的值最后未插入进去
    24. arr[end + 1] = temp;
    25. }
    26. }

    希尔排序:

    思路:

    希尔排序比插入排序多的就是预排序,而预排序的目的就是让大的数据/小的数据更快的被排到后面去,因为越接近有序的数据,使用插入排序时时间复杂度越接近O(N),而我们的希尔排序最后一步等同于插入排序

    图解:

    以代码一为例:

    代码:

    两个代码没有什么差别,只是一个是一组一组排,一个是并排。

    代码一:
    1. void ShellSort(int* arr, int n)
    2. {
    3. int gap = n;
    4. while (gap > 1)
    5. {
    6. //多组预排序,最后接近有序时插入排序
    7. gap /= 2;
    8. //完成一趟预排序
    9. for (int j = 0; j < gap; j++)
    10. {
    11. //完成一组预排序
    12. for (int i = j; i < n - gap; i += gap)
    13. {
    14. //走一组中的一个位置的预排序
    15. int end = i;
    16. int temp = arr[end + gap];
    17. while (end >= 0)
    18. {
    19. if (temp < arr[end])
    20. {
    21. arr[end + gap] = arr[end];
    22. end -= gap;
    23. }
    24. else
    25. {
    26. break;
    27. }
    28. }
    29. arr[end + gap] = temp;
    30. }
    31. }
    32. }
    33. }
    代码二:
    1. void ShellSort(int* arr, int n)
    2. {
    3. int gap = n;
    4. while (gap > 1)
    5. {
    6. //多组预排序,最后接近有序时插入排序
    7. gap /= 2;
    8. //等同于上面的希尔排序,不是分组排了,而是并排
    9. for (int i = 0; i < n - gap; i++)
    10. {
    11. //走一组中的一个位置的预排序
    12. int end = i;
    13. int temp = arr[end + gap];
    14. while (end >= 0)
    15. {
    16. if (temp < arr[end])
    17. {
    18. arr[end + gap] = arr[end];
    19. end -= gap;
    20. }
    21. else
    22. {
    23. break;
    24. }
    25. }
    26. arr[end + gap] = temp;
    27. }
    28. }
    29. }

  • 相关阅读:
    SpringCloud之Nacos配置中心解读
    51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储&秒表
    若依前后端分离版,快速上手
    CSS 动画特效运用目录
    【无标题】
    java字符集(编码与解码)--计算机翻译官
    paddle 43 用onnxruntime实现ppyoloe模型的部署
    14.一元二次方程组,有实根输出实根,没有实根输出虚根
    2023国赛数学建模C题思路模型代码 高教社杯
    【文件IO】文件系统的操作 流对象 字节流(Reader/Writer)和字符流 (InputStream/OutputStream)的用法
  • 原文地址:https://blog.csdn.net/m0_74824254/article/details/133135851