Python的几个常见的排序算法

本文介绍了Python中的五种常见排序算法:冒泡排序、选择排序、插入排序、希尔排序和快速排序。详细讲解了每种排序算法的工作原理、时间复杂度和稳定性,帮助读者深入理解各种排序算法的应用。
摘要由CSDN通过智能技术生成

1.冒泡排序

俩俩(两个相邻的元素i ,i+1)进行比较,根据条件,交换位置,每一次都会选出一个最大(最小)的元素

如果排序从小到大:每一次都会找到最大

如果排序从大到小:每一次都会找到最小

思路:
(1) n=len(li)
(2) 内循环 j j+1 比较 if li[j]>li[j+1] 交换位置
(3) 外循环 range(n-1)

def sortbuble(li):
  n=len(li)
    for i in range(n-1):
      for j in range(n-1-i):
	        if li[j]>li[j+1]:
             li[j],li[j+1]=li[j+1],li[j]
          print(li)
     # print(li)
    return li
    sortbuble([23,-8,26,-2,-6,-18,33])

时间复杂度:O(n^2) 最佳的时候可以达到O(n)
稳定性: 稳定的排序

2. 选择排序

每次选择一个最小(最大)的元素, 放在前面排好序。

每次定义一个min_index =0,跟其他元素相比较 ,找到真正的最小值的索引 min_index=真正的最小值索引

li[假的最小值位置] li[真的最小值]交换位置。

思路:
(1)n=len(li)
(2)内循环
min_index=i for range(i+1,n) 比较 if li[i] < li[min_index] min_index=i
(3)外循环
range(n-1)

def sortchoose(li):
    n=len(li)
    for i in range(n-1):
        min_index=i
        for j in range(i+1,n):
            if li[j]<li[min_index]:
                min_index=j
        li[i],li[min_index]=li[min_index],li[i]
        print(li)
li=[23,-8,26,-2,-6,-18,33]
 sortchoose(li)

时间复杂度 O(n^2)
稳定性 不稳定排序

3. 插入排序

从第二个元素开始,插入现有列表中(已经排好队的列表),

每个元素保证插入之后,列表都是有序的

(1)n=len(li)
(2) 内循环
第0个元素是排好队,
将第1个元素拿出来插入好队伍
temp=li[1]
判断:if temp<li[j] li[j+1]=li[j] while
外循环

li=[23,-8,26,-2,-6,-18,33]
n=len(li)
for i in range(1,n):
    # i 是要插入的元素的位置
    # i=1
    temp=li[i]
    j=i-1
    while temp<li[j] and j>=0:
        li[j + 1] = li[j]
        j-=1
    li[j+1]=temp
    print(li)

时间复杂度:O(n^2) 最优O(n)
稳定性:稳定排序

4. 希尔

最小增量排序,升级版的插入排序

使得原来的列表内部先进行分组排序

增量不定:没有规则

增量:间隔多少 i i+increnment i+2*increnment

规则:从大小 10 8 6 4 1

def shell(li,increment):
    n=len(li)
    for inc in increment:# 对增量列表
      for k in range(inc):# 分几个组
        for i in range(inc+k,n,inc):
            # i 是要插入的元素的位置
            # i=1
            temp=li[i]
            j=i-inc
            while temp<li[j] and j>=0:
                li[j + inc] = li[j]
                j-=inc
            li[j+inc]=temp
            print(li)
li=[3,-2,5,10,-9,11,7,-1]
increment=[3,2,1]
 shell(li,increment)

时间复杂度: O(n^2)
稳定性: 不稳定

5. 快速排序

从列表中选取一个中心点,使得中心点左侧的元素都小于该元素,中心点右侧的元素都大于该元素。

递归

def quick1(li):
    n=len(li)
    if len(li)<=1:
        return li
    else:
        mid=0
        small=[]
        bigger=[]
        for i in range(1,n):
            if li[mid]>li[i]:
                small.append(li[i])
            else:
                bigger.append(li[i])
    return quick1(small) + [li[mid]]  +quick1(bigger)
li=[3,-2,5,10,-9,11,7,-1,7]
print(quick1(li))

时间复杂度: O(n^2) 最好O(nlogn)
稳定:取决于算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值