写在前面:在排序算法中我们经常评论到这个算法是否是稳定的,很多同学可能对于这个概念有点懵,所以我们先来解释一下何谓稳定性排序
稳定性排序通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。
目录
1.希尔排序
希尔排序是D.L.shell于1959年提出来的排序算法,在这之前(见排序1),排序算法的时间复杂度基本都是O(n^2),希尔排序是突破这个时间复杂度的第一批算法之一。
1.1 基本原理
上面讲的插入排序,在记录本身比较有序或者当记录较少时,比较高效。而希尔排序就是先使记录基本有序,然后再对全体记录进行一次插入排序。所谓基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间,像{2,1,3,6,4,7,5,8,9}这样的就可以称为基本有序了。但像{1,5,9,3,7,8,2,4,6}这样的9在第三位,2在倒数第三位就谈不上基本有序
1.2 希尔排序算法
考虑到是记录基本有序,可以采用增量比较法,arr[i]先不直接与arr[i+1]比较,而是与arr[i+increment]比较,这个increment就称之为增量,在python代码中用group表示。假设初始记录arr为{9,1,5,8,3,7,4,6,2},初始增量group=4
i = 0时,比较arr[0]=9与arr[4]=3的大小,因为arr[0]>arr[4],所以交换9,3位置,记录为{3,1,5,8,9,7,4,6,2}
同时比较arr[4]>arr[8],故交换,arr[0]>arr[4],交换,得到记录{2,1,5,8,3,7,4,6,9}
i= 1时,比较arr[1]=1与arr[5]=7的大小,前者小于后者,不交换
i= 2时,比较arr[2]=5与arr[6]=4的大小,前者大于后者,故交换,记录为{2,1,4,8,9,7,5,6,9}
i= 3时,比较arr[3]=8与arr[7]=6的大小,前者大于后者,故交换,记录为{2,1,4,6,3,7,5,8,9}
此时序列已经达到基本有序,接下来减少增量group=2,循环一轮后,再次缩小group=1,便可以使记录达到有序
1.3 python代码
def shell_sort(arr):
count = len(arr)
step = 2
group = int(count / step)
while group > 0:
for i in range(0,group):
j = i + group
while j < count:
k = j - group
key = arr[j]
while k >= 0:
if arr[k] >