希尔排序(shell_sort)

版权声明:转载请告知本人 https://blog.csdn.net/qq_41844543/article/details/88824331

希尔排序实现过程及其原理

希尔排序其实就是插入排序的一种升级版,希尔排序将数据按步长(gap)来分组,分别对每一组数据都使用插入排序,接着减小步长继续分组继续排序知道步长为1时就排好续了。
例如:{10, 21 ,56, 31, 14, 78, 13, 12}
此组数据有8个元素,那我假定步长为4 = 8 / 2

  1. 步长为4时:
    {10, 14}, {21, 78}, {56, 13}, {31, 12}
    对每组排序后
    {10, 14}, {21, 78}, {13, 56}, {12, 31}
    得到原数组变为:
    {10, 21, 13, 12, 14, 78, 56, 31}
  2. 步长减半为2时:
    {10, 13, 14, 56}, {21, 12, 78, 31}
    对每组排序后
    {10, 13, 14, 56}, {12, 21, 31, 78}
    得到原数组变为:
    {10, 12, 13, 21, 14, 31, 56, 78}
  3. 步长减半为1时:
    {10, 12, 13, 21, 14, 31, 56, 78}
    排序后
    {10, 12, 13, 14, 21, 56, 78}
    按我的理解来说,插入排序是对基本有序的数组效率高,所以希尔排序就巧妙地运用了这个点让插入排序每次都是对基本有序的数组进行排序的从而提高了插入排序的效率改进为了O(n3/2)

代码

python

def shell_sort(arr):
    gap = int(len(arr)/2)
    # gap为步长while确定步长大小
    while gap >= 1:
    	# 确定需要排列的组数
        for i in range(gap):
        	# 插入排序 注意此时的步长为gap
            for j in range(i, len(arr), gap):
                preIndex = j - gap
                current = arr[j]
                while preIndex >= i and current <= arr[preIndex]:
                    arr[preIndex + gap] = arr[preIndex]
                    preIndex -= gap
                arr[preIndex + gap] = current
        gap = int(gap/2)
    return arr


arr = []
for i in range(10):
    num = float(input("please enter a number:"))
    arr.append(num)

shell_sort(arr)
print(arr)

输入与输出

please enter a number:15
please enter a number:21
please enter a number:14
please enter a number:26
please enter a number:84
please enter a number:13
please enter a number:54
please enter a number:33
please enter a number:34
please enter a number:53
[13.0, 14.0, 15.0, 21.0, 26.0, 33.0, 34.0, 53.0, 54.0, 84.0]

猜你喜欢

转载自blog.csdn.net/qq_41844543/article/details/88824331