Python 常见的排序算法 选择排序 快速排序

本文介绍了两种常见的排序算法——选择排序与快速排序,并详细解释了它们的工作原理及时间复杂度。选择排序通过反复查找未排序部分的最小值并将其移至已排序序列的末尾来实现排序;而快速排序则采用分治法,通过选取基准值将数组分为大小两个子数组再分别进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见的排序算法

选择排序

# selectSort
def fineMin(arr):
    min_index = 0
    min = arr[0]
    for i in range(1,len(arr)):
        if arr[i] < min:
            min_index = i
    return min_index

def selectSort(arr):
    new_arr = [] #定义空数组用来存放数据
    for i in range(len(arr)):
        min_index = fineMin(arr)
        new_arr.append(arr.pop(min_index))
    return new_arr

  时间复杂度 O ( n 2 ) O(n^2) O(n2),解释:
  例如对于 [ 7 3 5 1 2 8 0 ] 含7个元素的数组,从小到大排序,使用选择排序的方法为:
  第一步:遍历整个待排序的数组,查找到最小值0,放入新数组中 [ 0 ],剩余的数组为 [ 7 3 5 1 2 8 ];
  第二步:遍历整个待排序的数组,查找到最小值1,放入新数组中 [ 0 1 ],剩余的数组为 [ 7 3 5 2 8 ];
  第三步:遍历整个待排序的数组,查找到最小值2,放入新数组中 [ 0 1 2 ],剩余的数组为 [ 7 3 5 8 ];
  第四步:遍历整个待排序的数组,查找到最小值3,放入新数组中 [ 0 1 2 3 ],剩余的数组为 [ 7 5 8 ];
  第五步:遍历整个待排序的数组,查找到最小值5,放入新数组中 [ 0 1 2 3 5 ],剩余的数组为 [ 7 8 ];
  第六步:遍历整个待排序的数组,查找到最小值7,放入新数组中 [ 0 1 2 3 5 7 ],剩余的数组为 [ 8 ];
  第七步:遍历整个待排序的数组,查找到最小值8,放入新数组中 [ 0 1 2 3 5 7 8 ],剩余的数组为 [ ];
  上述中每一步的时间复杂度为 O ( n ) O(n) O(n) ,一共有 n n n 步,因此选择排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。由此可见,选择排序并不是一种很高效的排序方法。

快速排序

def quickSort(arr):
    if len(arr) < 2:
        return arr
    else:
        basic = arr[0] # 数组的第一个值为基准值
        less = [ i for i in arr[1:] if i <= basic] # 小于基准值的子数组
        greater = [i for i in arr[1:] if i > basic] #大于基准值的子数组
        return quickSort(less) + [basic] + quickSort(greater)

  平均运行时间 O ( n ⋅ l o g n ) O(n·logn) O(nlogn) ,解释:
  当选择基准数据时,该数据在通常情况下,能将待排序的数据较为平均地分成两部分:
  举个最理想的情况:
  对 [ 1 2 3 4 5 6 7 8 9 ] 待排序的数组使用快速排序,(【】内为基准数据,QS是quickSort的缩写)
第一步:     QS[1 2 3 4]     【5】         QS[ 6 7 8 9]
第二步:   QS[1] 【2】  QS[ 3 4]          QS[6] 【7】   QS[8 9]
第三步:         【3】QS[4]                【8】QS[9]

  当待排序的数组为空或只有一个时,排完序也就是其本身,因此每一步分区(找出大于基准数据的子数组和小于基准数据的子数组)需要 n n n 步,时间复杂度为 O ( n ) O(n) O(n) ,该理想情况下,只需 l o g n log n logn 步,因此所需的时间复杂度为 O ( n ⋅ l o g n ) O(n·logn) O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值