直接插入排序,希尔排序比较

723 阅读4分钟

写在前面

在做牛客网上的一套网易笔试题的时候有一题考到插入排序,于是我找出《数据结构》将排序的思想做了个小小的总结。

插入排序

  • 插入排序:包括直接插入排序,希尔排序

直接插入排序

1.思想

直接插入排序的排序思想是:假如我们要对一个数组进行排序,我们用一个新的数组来保存排序后的结果。新数组的数据元素从只有一个开始,逐次增大。当新数组与原来的数组元素个数相同的时候排序结束。

为了便于大家理解这里说用到了一个新数组,实际上并没有引入新的数组,它是原来数组的一个子集,子集不断增大当直到与原数组一样大排序结束。后面玲珑就不再说新数组

1.设待排序的n个数据元素存放在数组中,子数组取第一个元素a[0]。

2.第一次循环比较a[0]和a[1]的大小,如果a[0]>a[1],那么就将a[1]放到a[0]的前面。子集里面的元素就从一个变成了两个。

3.第二次比较我们比较a[2]和a[1],a[0]的大小。首先a[2]和a[1]进行比较,如果a[2]<a[1]就把a[1]放到a[2]的后面。然后比较a[2]和a[0]的大小来判断是否把a[2]插入到a[0]的前面......

4.当最后一个元素a[n-1]的与前面n-1个元素比较完毕后数据元素集合排好了。

2.举例

我们举一个例子来加深一下印象。见下图的排序

1.初始化的时候,子集是[64],要比较的是将5和64进行比较。

2.第一次排序后的结果:子集是[5,64]。然后进行第二次比较将7先和64比较然后和5比较

3.第二次排序后结果:子集[5,7,64]。然后进行第三次比较,将89与子集进行比较,发现89大于64则不再深入比较

4.第三次排序结果:子集[5,7,64,89]。然后6与子集进行第四次比较。

5.第四次排序结果:子集[5,6,7,64,89]。然后24与之比较。

6.第五次排序结果:子集与原数组相等,排序结束。

3.复杂度分析

  • 最好的情况:原始数据已经排好序,外层控制次数一共n-1次,内层每次只比较一次,元素赋值语句每次均执行2次,所以赋值语句执行次数是2(n-1).时间复杂度O(n)。
  • 最坏情况:原始数据倒序,时间复杂度O(n*2)。 -排列随机:介于最好和最坏之间。

希尔排序

希尔排序也叫减小增量排序,是直接插入排序的升级版,接下来来看看它的思想

1.思想

希尔排序将待排序的数按步长分成若干个小组(步长即间隔·),对每一个小组的元素进行直接插入排序。然后减小步长再进行分组,对每一组排序。直到最后步长=1,也是就一个元素为一组的时候进行最后一次插入排序。排序结束。

2.特点

  • 希尔排序和直接插入排序相比,优点就在于分组排序能够让整个数组元素接近有序,提高了时间效率。
  • 分组的步长不统一表现出不稳定性。

3.举例

  • 该例子里面先让步长为6,(a)图中圆圈,三角形,方形代表了不同的小组,一共有六组 每一组按顺序进行快速排序。
  • (b)图首先是a图中排序后的结果,然后再让步长为3进行分组,对每个小组进行快速排序。
  • (c)图拿到b图的结果然后步长为1进行分组,然后排序。排序结束

总结一下

  • 该排序有四重循环。第一趟循环是步长(希尔值)的个数,如上面的例子希尔值分别有6,3,1三种。希尔值是自己设定的,具有不确定性。第二趟循环控制了分组,比如第一次分成了6组,第二次分成了3组,最后一次只有一组。第三层和第四层循环就等同前说的直接插入排序的两层循环。

4.复杂度分析

希尔排序的复杂度不确定性,实际所需时间和分组的个数和步长有关,排序合理时间复杂度O(n(lbn)*2),空间复杂度是O(1)。

文章末尾

文章不长,希望能给你带来启发 ee ending...