python实现常见的一些排序算法

1、选择排序法

def func(li):
    for i in range(len(li)-1):
        for j in range(i+1,len(li)):
            if li[i]>=li[j]:
                li[i],li[j]=li[j],li[i]
    return li

在这里插入图片描述

2、冒泡排序法

def func(li):
    for i in range(len(li)-1):
        for j in range(len(li)-1-i):
            if li[j]>=li[j+1]:
                li[j],li[j+1]=li[j+1],li[j]
    return li

在这里插入图片描述

3、快速排序法

def quick_sort(li):
    if len(li)<2:
        return li
    mid=li[(len(li)-1)//2]
    left,right=[],[]
    li.remove(mid)
    for i in li:
        if i>=mid:
            right.append(i)
        else:
            left.append(i)
    return quick_sort(left)+[mid]+quick_sort(right)

一行代码实现快排

quick_sort=lambda li:li if len(li)<2 else quick_sort([item for item in li[1:] if item<=li[0]])+[li[0]]+quick_sort([item for item in li[1:] if item>=li[0]])

在这里插入图片描述

4、归并排序法

def merge_sort(li):
    if len(li)<2:
        return li
    mid=len(li)//2
    left=li[:mid]
    right=li[mid:]
    return merge(merge_sort(left),merge_sort(right))
def merge(left,right):
    result=[]
    while len(left)>0 and len(right)>0:
        if left[0]<=right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    result+=left
    result+=right
    return result
li=[1,5,2,0,8,7,6,3]
print(merge_sort(li))

在这里插入图片描述

5、堆排序法

# 构造最大堆
def max_heap(li,root_index, end_index):
    # 减1是因为堆的下标从1开始,节点i存在子节点,左子节点的索引必定为2*i
    max_child_index = root_index * 2 - 1
    # 在该树有俩个子节点的情况下,将俩个子节点比较大小
    if max_child_index + 1 < end_index:
        if li[max_child_index + 1] > li[max_child_index]:
            max_child_index += 1
    # 将最大的子节点与根节点做比较
    if li[max_child_index] > li[root_index - 1]:
        li[max_child_index], li[root_index - 1] = li[root_index - 1], li[max_child_index]

def heap_sort(li):
    #循环构造最大堆,然后将根节点与末节点调换
    for end_index in range(len(li),1,-1):
        #每次要构造的最大堆大小与末节点有关
        max_root_index = end_index//2
        #构造一个最大堆
        for root_index in range(max_root_index,0,-1):
            max_heap(li,root_index,end_index)
        #将最大堆的根节点与末节点调换
        li[0],li[end_index-1]=li[end_index-1],li[0]

a = [1,28,5,3,7,4,5,3,6,2,0]
heap_sort(a)
print(a)

欧克

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值