数据结构Python实现-希尔排序算法

希尔排序的思想

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的数据放在一起。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量等于1,即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。一般的初次取序列的一半为增量,以后每次减半,直到增量为1。即gap=n//2

希尔排序的代码实现

def shell_sort(alist):
    n=len(alist)
    gap=n//2          # 取整除
    while gap > 0:
         for j in range(gap,n):  
             i=j
             while i > 0:
                 if alist[i] < alist[i-gap]:
                     alist[i],alist[i-gap]=alist[i-gap],alist[i]
                     i=i-gap
                 else:
                    break;
         gap=gap//2
    #return alist
                
                
if __name__ =="__main__":
    alist=[0,1,8,7,9,2,10]
    print(alist)
    shell_sort(alist)
    print(alist) 

其中只是把直接插入排序进行了一点点的改进,仅仅改变了交换的步长,比较的是选出来的每一部分而不是一个整体了。此代码是用了while循环。

def shell_sort(alist):
    n=len(alist)
    gap=n//2          # 取整除
    while gap > 0:
         for j in range(gap,n):  
             for i in range(j,0,-gap):
                 if alist[i] < alist[i-gap]:
                     alist[i],alist[i-gap]=alist[i-gap],alist[i]
                 else:
                    break;
         gap=gap//2
    #return alist
                
                
if __name__ =="__main__":
    alist=[0,1,8,7,9,2,10]
    print(alist)
    shell_sort(alist)
    print(alist) 

第二种方法,实现希尔排序,是把直接插入排序改成了两个for循环的格式

关键

用一个while循环进行控制,因为只有gap等于1时循环才会停止,所以,每次比完一次之后,gap就变成原来的一半,while循环来控制gap等于1这个条件,一旦满足条件结束循环。

发布了40 篇原创文章 · 获赞 1 · 访问量 2044

猜你喜欢

转载自blog.csdn.net/qq_40660825/article/details/102292555