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

news/2024/5/19 23:51:30 标签: 算法, python, 排序算法, 快速排序, 列表

1.冒泡排序算法

python"># 冒泡排序算法(从小到大)
#方法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.快速排序算法

python">#快速排序算法(从小到大)
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.选择排序算法

python">#选择排序算法(从小到大)
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.堆排序算法

python">#堆排序算法(从小到大)
#调整堆
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.插入排序算法

python">#插入排序算法(从小到大)
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.希尔排序算法

python">#希尔排序算法(从小到大)
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.归并排序算法

python">#归并排序算法
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))

http://www.niftyadmin.cn/n/1711999.html

相关文章

算法设计 加油问题

算法设计 加油问题 1. 问题描述 一个旅行家想驾驶汽车从城市A到城市B&#xff08;设出发时油箱是空的&#xff09;。给定两个城市之间的距离dis、汽车油箱的容量c、每升汽油能行驶的距离d、沿途油站数n、油站i离出发点的距离d[i]以及该站每升汽油的价格p[i],i1,2,…,n。设d[1]…

算法设计 寻宝问题

算法设计 寻宝问题 1. 问题描述 对于某个m*n的字符串数组&#xff0c;相当于一个m行n列的平面形状的方格。里面S表示起点&#xff0c;W表示障碍&#xff0c;B表示可走&#xff08;但是不一定可以通&#xff09;&#xff0c;X表示出口。对于起点S&#xff0c;有8个方向可以走&a…

使用Python中的value_counts()函数统计excel表格中不同数据出现的次数,调用pandas中 的value_counts()函数,可以对Series里面的每个值进行计数并且排序

#将excel列转化为python中的Series,即一维数组&#xff0c;然后统计Series中各数据的频数 import pandas as pd data pd.read_excel(rC:/Users/Administrator/Desktop/data.xlsx) #读取excel表格数据 count data[number].value_counts()#number为表格列名 print(count)

Python实现基于高斯核函数,线性核函数和多项式核函数的SVR(支持向量回归)及预测算法

#(SVR)支持向量回归算法 import numpy as np from sklearn.svm import SVR import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-serif] [SimHei]Xnp.sort(5*np.random.rand(40,1),axis0) #生成40组数据,按列排列 ynp.sin(X).ravel() #生成40组数据…

算法设计 邮票问题

算法设计 邮票问题 1. 问题描述 设有n种不同面值a1, a2,…, an的邮票&#xff0c;规定每封信最多贴m张邮票。对于给定的m&#xff0c;n&#xff0c;求出最大的邮资连续区间。例如&#xff0c;给定n3&#xff0c;m3&#xff0c;邮票面值分别为2, 3, 5&#xff0c;则最大的邮资连…

Python实现二叉树的前序遍历,中序遍历和后序遍历算法

1.测试用例&#xff1a; 前序遍历&#xff1a;DBACEGF 中序遍历&#xff1a;ABCDEFG 后序遍历&#xff1a;ACBFGED 2.编写python代码: #二叉树遍历算法 class Node:def __init__(self,valueNone,leftNone,rightNone):self.valuevalueself.leftleftself.rightright#先序遍历…

python二分法计算某个数的平方根

#二分法求解平方根 def halfsqrt(num):resultnum/2.0low0.0highnum*1.0while abs(result**2-num)>0.000001:if result**2>num:highresultresultlow(high-low)/2else:lowresultresulthigh-(high-low)/2return result if __name__ __main__:num10print("%d的平方根为…

python实现图的深度优先遍历(DFS)和广度优先遍历(BFS)算法

#图的深度优先和广度优先遍历 def DFS(graph,s): #深度优先遍历,基于栈stack[] #建立栈stack.append(s) data[] #记录已经遍历过的点data.append(s)while stack:nstack.pop() # 取出栈中最后一个元素并删掉nodesgraph[n]for i in nodes[::-1]: #栈先进后出if i not in data:st…