数据结构与算法篇——排序

1、冒泡
最差,平均时间复杂度:O(n**2),两个for循环
最好:O(n),改进算法下(如果有一趟循环中没有进行交换,则停止)对已排好序的数组

def maopao_sort(list_):
    for i in range(len(list_)-1):
        for j in range(i+1,len(list_)):
            if list_[j]<list_[i]:
                list_[i],list_[j]=list_[j],list_[i]
    return list_                
def gaijin_maopao(list_):
    for i in range(1,len(list_)):
        flag=False
        for j in range(len(list_)-i):
            if list_[j]>list_[j+1]:
                list_j,list_[j+1]=list_[j+1],list_[j]
                flag=True
        if not flag:
            break

2、插入
最差,平均时间复杂度:O(n**2),两个for循环
最好:O(n),对已排好序的数组,第二个循环中每个数字只比较一次就结束

def insertsort(s):
    for i in range(1,len(s)):
        tem=s[i]
        j=i-1
        while j>=0 and s[j]>tem:
            s[j+1],tem=tem,s[j]
            j-=1
    return s

3、快排
最好、平均时间复杂度:O(nlog2n),递归,T(n)=2T(n/2)+n
最坏,O(n**2),T(n)=T(n-1)+n,每次划分成1和n-1两组数

def quick_sort(list_):
    if len(list_)<=1:
        return list_
    else:
        a=list_[0]
        left=[i for i in list_[1:] if i<=a]
        right=[j for j in list_[1:] if j>a]
        return quick_sort(left)+[a]+quick_sort(right)

4、选择
最坏最好平均时间复杂度都为O(n**2),两个for循环

def select_sort(list_):
    for i in range(len(list_)-1):
        min_=i
        for j in range(i+1,len(list_)):
            if list_[j]<list_[min_]:
                min_=j
        list_[min_],list_[i]=list_[i],list_[min_]
    return list_

5、堆排序
三个时间复杂度都为O(nlog2n),n*层数(log2n)
建堆过程O(n)可忽略
此处偷懒

from heapq import heappush,heappop
def heapsort(list_):
    h=[]
    for value in list_:
        heappush(h,value)
    return [heappop(h) for i in range(len(h))]

6、归并
三个时间复杂度都为O(nlog2n),递归,T(n)=2T(n/2)+n

def mergesort(list_):
    mid=len(list_)//2
    left,right=list_[:mid],list_[mid:]
    if len(left)>1:
        left=mergesort(left)
    if len(right)>1:
        right=mergesort(right)
    res=[]
    while left and right:
        if left[-1]>right[-1]:
            res.append(left.pop())
        else:
            res.append(right.pop())
    res.reverse()
    return (left or right) +res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值