数据结构——插入排序与希尔排序(python)

直接插入排序

基本思想:

将数组中的待排序元素和前面排好序的元素做比较,如果选择的元素和已排序的元素小,就交换,直到所有的元素都比较过。

此算法需要两层循环:

1、循环遍历待排序的元素;

2、选择的元素A和 已排序 的所有元素比较。

python实现:

def insertionSort(arr): 
  
    for i in range(1, len(arr)): 
        key = arr[i]
 
        j = i-1

        while j >=0 and key < arr[j] : 
            arr[j+1] = arr[j] 
            j -= 1

        arr[j+1] = key 

  插入排序的 最坏时间复杂度 O(n2^) ,如果 这个数组已经是有序的了,那么内层循环只发生一次比较,不发生交换,也不用循环比。此时最优时间复杂度O(n*1)  即循环 外层的 n * 内层的 1

  稳定排序。

 

希尔排序

希尔排序也称之为递减增量排序,是对插入排序的改进。按前面说,对已经近乎排序好的序列做插入排序,效率很高,可以达到近乎线性。但是插入排序效率也是比较低的,他一次只能将数据向前移一位。比如如果一个长度为N的序列,最小的元素如果恰巧在末尾,那么使用插入排序仍需一步一步的向前移动和比较,要N-1次比较和交换。

希尔排序通过将待比较的元素划分为几个区域来提升插入排序的效率。这样可以让元素可以一次性的朝最终位置迈进一大步,然后算法再取越来越小的步长进行排序,最后一步就是步长为1的普通的插入排序的,但是这个时候,整个序列已经是近似排好序的,所以效率高。

希尔步长的选择:常见的 取 N/2, N/4, ...,1(重复除以2)

python 实现:

def shell_sort(alist):
    """
    希尔排序
    """
    n = len(alist)
    gap = int(n/2)
    #控制gap,gap的最终取值是1
    while gap >= 1:
        for i in (gap,n):
            temp = alist[i]
            j = i-gap
            while j >= 0 and alist[j] > temp:
                alist[j+gap] = alist[j]
                j -= gap
            a[j+gap] = temp
        gap = int(gap/2)

希尔排序是不稳定的一种排序算法 。                

               

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值