python-排序算法

1.插入排序(直接插入)

    def insert_sort(alist):  #插入排序 O(n^2)  稳定排序
        length = len(alist)
        for i in range(1,length):
            key = alist[i]
            j = i -1
            while j>0:
                if alist[j]>key:
                    alist[j+1] = alist[j]
                    alist[j] = key
                j -= 1
        return alist

2.希尔排序(插入排序的一种),分组进行插入排序
希尔排序的特点:
a.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
b.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
c.子序列的构成不是简单的“逐段分割”,而是将像个某个“增量“的记录组成一个组序列。
用下面的这张图来解释,这是数据结构书中的示例图
这里写图片描述
第一趟的增量为5,第二趟的增量为3,第三趟的增量为1
增量的选择问题:
希尔排序的原理是每次对无序序列中的数隔d(增量)进行排序,这样,对着增量的减小,序列也会越来越有序,当增量减小到1时,序列也就成有序状态了。增量不一定是奇数,事实上,增量数组的选取是一个有很深入学问的事情,一个好的增量数组,可以使算法效率达到最快,这与数据的数量和混乱程度有关,然而,只要一个数组是递减的,并且最后一个值是1,都可以作为增量数组使用,并且也能完成排序工作,但是效率上可能就低一点了,也就是说算法的复杂度要升高。

def shell_sort(lists):
    # 希尔排序
    length = len(lists)
    step = 2
    group = length / step
    while group > 0:
        for i in range(0, group):
            j = i + group
            while j < length:
                k = j - group
                key = lists[j]
                while k >= 0:
                    if lists[k] > key:
                        lists[k + group] = lists[k]
                        lists[k] = key
                    k -= group
                j += group
        group /= step
    return lists

3.冒泡排序

    def bubble_sort(alist):   # 冒泡排序 O(n^2)  稳定排序
        length = len(alist)
        for i in range(length):
            for j in range(i+1,length):
                if alist[i]>alist[j]:
                    alist[i],alist[j] = alist[j],alist[i]
        return alist

4.快速排序

    def quick_sort(alist,left,right):    # 快速排序 O(nlogn)  不稳定排序
        if left >= right:
            return alist
        low = left
        high = right
        key = alist[low]
        while left<right:
            while left<right and alist[right]>key:
                right -= 1
            alist[left] = alist[right]
            while left<right and alist[left]<key:
                left += 1
            alist[right] = alist[left]
        alist[left] = key
        quick_sort(alist,low,left-1)
        quick_sort(alist,left+1,high)
        return alist
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值