插入排序

  • 直接插入排序
    类似整理扑克牌的过程,将之后待排序的关键字插入到之前已经排序完成的序列中
    特点:边插入边排序,保证子序列随时都是排好序的

        def InsertSort(array):
            length = len(array)
            for i in range(1, length):
                j = i - 1
                x = array[i]
                # 为方便循环条件,可以采用哨兵位
                while (j >= 0 and array[j] > x):
                    array[j + 1] = array[j]
                    j -= 1
                array[j + 1] = x
            return array
    

    直接插入法的性能:
    最好情况下是待插入序列已经是排好序的,之后直接在尾端插入即可,并且不需要进行数据元素的移动
    时间复杂度即为比较的次数 n-1次,首个元素直接选定,所以时间复杂度为o(n)

      最坏情况下是待插入序列是逆序的,寻找插入位置需要遍历前面所有的元素,移动元素也需要将前面所有的元素都后移;第二个元素插入位置需要比较1次,然后向后移动一个元素;第三个元素插入位置需要比较2次,然后之前的元素都需要向后移动,所以时间复杂度为o(比较)+o(移动) n(n-1)/2 + n(n-1)/2 所以时间复杂度为o(n^2)
      
      平均时间复杂度为o(n^2)
      直接插入排序算法为一种稳定的排序算法(注意排序的稳定性不是算法优劣性的衡量标准)
    
  • 折半插入排序
    折半插入排序和直接插入排序的移动元素思想是一致的,主要区别在于比较的方式即寻找元素插入位置的方式,折半插入排序采用二分查找的方式,而直接插入排序采用顺序查找的方式;

        def BinInsertSort(array):
            length = len(array)
            for i in range(1, length):
                x = array[i]
                low = 0
                high = i - 1
                while (low <= high):
                    mid = (low + high) // 2
                    if array[mid] > x:
                        high = mid - 1
                    else:
                        low = mid + 1
                j = i - 1
                while (j >= (high + 1)):
                    array[j + 1] = array[j]
                    j -= 1
                array[high+1] = x
            return array
    

    折半插入排序的性能:
    比较的效率提高了,但是移动的次数并没有改变,时间复杂度仍然为o(n^2),也是一种稳定的排序算法,关键字大小相同的元素相对位置并未发生改变;

  • 希尔排序
    希尔排序的思想在于扩大移动的步上,使得一次移动后比较接近其最终位置;该排序算法使用了增量序列,针对每一个序列值,进行直接插入排序,最后的增量序列必须为1,通过直接插入排序法使得相对有序的序列成为有序序列;

        def ShellSort(array, series):
            for k in series:
                ShellInsertSort(array, k)
            return array
    
    
        def ShellInsertSort(array, k):
            for i in range(k, len(array)):
                x = array[i]
                j = i - k
                while (j >= 0 and array[j] > x):
                    array[j + k] = array[j]
                    j -= k
                array[j + k] = x
    
    

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值