python实现几种常用的排序算法(冒泡排序,快速排序,选择排序,堆排序,插入排序,希尔排序,归并排序),带注释简单通俗易懂

1.冒泡排序算法

# 冒泡排序算法(从小到大)
#方法1
def bubblesort(data):
    n=len(data)
    for i in range(0,n):
        for j in range(i+1,n):
            if data[i]>data[j]:
                data[i],data[j]=data[j],data[i]
    return data
if __name__ == '__main__':
    a=[58,47,69,20,15,66,52,80,30,64]
    print(bubblesort(a))


#方法2  
def bubblesort(target):
    length=len(target)
    while length>0:
        length-=1
        cur=0
        while cur<length:
            if target[cur]>target[cur+1]:
                target[cur],target[cur+1]=target[cur+1],target[cur]
            cur+=1
    return target
if __name__ == '__main__':
    a=[58,47,69,20,15,66,52,80,30,64]
    print(bubblesort(a))

2.快速排序算法

#快速排序算法(从小到大)
def quicksort(data):    
    if len(data) >= 2:  # 递归入口及出口        
        mid = data[len(data)//2]  # 选取中间基准值,也可以选取第一个或最后一个元素        
        left, right = [], []  # 定义基准值左右两侧的列表        
        data.remove(mid)  # 从原始数组中移除基准值        
        for num in data:            
            if num >= mid:                
                right.append(num)            
            else:                
                left.append(num)        
        return quicksort(left) + [mid] + quicksort(right)    
    else:        
        return data
if __name__ == '__main__':
    array = [2,3,5,7,1,4,6,15,5,2,7,9,10,15,9,17,12]
    print(quicksort(array))

3.选择排序算法

#选择排序算法(从小到大)
def selectsort(data):
    length=len(data)
    for i in range(0,length):
        min=i
        for j in range(i+1,length):
            if data[min]>data[j]:
                min=j
        data[min],data[i]=data[i],data[min]
    return data
if __name__=='__main__':
    a=[58,47,69,20,15,66,52,80,30,64]
    print(selectsort(a))

4.堆排序算法

#堆排序算法(从小到大)
#调整堆
def adjust(list,i,length):
    lchild=2*i+1 #定义左节点
    rchild=2*i+1 #定义右节点
    max=i #定义根节点数为最大
    if i<length/2: #判断i是否为根节点
        if lchild<length and list[lchild]>list[max]:
            max=lchild
        if rchild<length and list[rchild]>list[max]:
            max=rchild
        if max!=i:
            list[max],list[i]=list[i],list[max]
            adjust(list,max,length)
#创建堆
def create(list,length):
    for i in range(0,(int(length/2)))[::-1]:#将i从后向前递减取数:
        adjust(list,i,length)
#堆排序
def sort(list):
    length=len(list)
    create(list,length)
    for i in range(0,length)[::-1]:
        list[0],list[i]=list[i],list[0]
        adjust(list,0,i)
        return list
if __name__ == '__main__':
    a=[58,47,69,20,15,66,52,80,30,64]
    print(sort(a))  

5.插入排序算法

#插入排序算法(从小到大)
def insertsort(list):
    length=len(list)
    for i in range(1,length):
        temp=list[i] #将当前值保存到临时变量temp中
        j=i-1 #当前值与前一个值
        while j>=0:
            if list[j]>temp: #若前一个值大于当前值
                list[j+1]=list[j] #前一个值后移一位
                list[j]=temp #将较小的值前移一位
            j-=1 #继续循环
    return list
if __name__ == '__main__':
    a=[58,47,69,20,15,66,52,80,30,64]
    print(insertsort(a))

6.希尔排序算法

#希尔排序算法(从小到大)
def shellsort(list):
    length=len(list) #列表长度
    gap=length//2 #初始步长
    while gap>=1: #步长最小为1
        for i in range(gap,length):
            while i>=gap and list[i-gap]>list[i]:
                list[i-gap],list[i]=list[i],list[i-gap]
                i-=gap
        gap//=2
a=[58,47,69,20,15,66,52,80,30,64]
shellsort(a)
print(a)   

7.归并排序算法

#归并排序算法
def merge_sort(lst):
    if len(lst) <= 1:
        return lst
    middle = int(len(lst)/2)
    left = merge_sort(lst[:middle])
    right = merge_sort(lst[middle:])
    merged = []
    while left and right:
        merged.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
    merged.extend(right if right else  left)
    return merged
data_lst=[58,47,69,20,15,66,52,80,30,64]
print(merge_sort(data_lst))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值