数据结构-插入排序&希尔排序

电玩女神 2022-06-04 04:05 320阅读 0赞

一、插入排序


<1>介绍:插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

<2>思路:
从第一个元素依次进行以下操作:对于当前元素可以认为当前元素之前的部分已经有序;取出当前位置的下一个元素作为要排序的值,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于新元素,将该元素移到下一位置;直到找到已排序的元素小于或者等于新元素的位置,将新元素插入到该位置中;
分别把下标从0到数组元素个数-1的元素作为end,进行以上操作;每次循环的目的就是为了将当前tmp值放置在之前序列中该放的位置上,使得当前部分序列有序。

<3>优缺点:
假如现在需要将12345进行升序插入排序,按照插入排序的特性时间复杂度为O(N),所以插入排序针对于接近有序的序列时间复杂度较低;但是若将12345进行降序排,那么时间复杂度就会变为O(N^2);所以有了接下来的希尔排序。总之:对于接近有序的序列进行插入排序效率较优,对于无序的平均时间复杂度就会提升到O(N^2)。

<4>实现:
  1. void InsertSort(int* arr, int sz)
  2. {
  3. for (int i = 0; i < sz - 1; i++)
  4. {
  5. int end = i;
  6. int tmp = arr[end + 1];
  7. while (end >= 0)
  8. {
  9. if (arr[end] > tmp)
  10. {
  11. arr[end + 1] = arr[end];
  12. end--;
  13. }
  14. else
  15. break;
  16. }
  17. arr[end + 1] = tmp;
  18. }
  19. }

<4>图示过程:

这里写图片描述


二、希尔排序


<1>介绍:希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本,先将序列进行预排序再不断缩小间隔,当间隔为1时即为插入排序。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1、插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率;
2、但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位。

<2>思路及排序效果:
①:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序;
②:然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

大致思路和插入排序相同,区别在于希尔排序可以给定一个gap值,也就是间隔,可以预先先将间隔gap的序列对应有序,再不断缩小gap值,到最后一趟依次比较。
这里写图片描述


<3>实现:
  1. void ShellSort(int* arr, int sz)
  2. {
  3. int gap = 3;
  4. while (gap > 1)
  5. {
  6. gap = gap / 3 + 1;
  7. for (int i = 0; i < sz - gap; i++)
  8. {
  9. int end = i;
  10. int tmp = arr[end + gap];
  11. while (end >= 0)
  12. {
  13. if (tmp < arr[end])
  14. {
  15. arr[end + gap] = arr[end];
  16. end -= gap;
  17. }
  18. else
  19. break;
  20. }
  21. arr[end + gap] = tmp;
  22. }
  23. }

<4>图示过程:

这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,320人围观)

还没有评论,来说两句吧...

相关阅读

    相关 插入排序:

    按一定跨度d两两进行比对并按序交换位置,进行完一轮比对后跨度缩小再进行下一轮,经过几轮后先将整个序列变成部分有序,然后再进行直接插入排序,减少直接插入排序的开销。 ![Cen

    相关 插入排序——排序

    / 算法思想: 先将整个待排序元素序列分割成若干子序列,对每个子序列分别进行直接插入排序。 当整个待排序元素序列“基本有序”时,再