数据结构与算法(python):冒泡排序和选择排序算法及分析

参考自 MOOC数据结构与算法Python版

一、冒泡排序(Bubble Sort)

1.1 算法思路

在于对无序表进行多趟比较交换,每趟包括了多次两两相邻比较, 并将逆序的数据项互换位置, 最终能将本趟的最大项就位,经过n-1趟比较交换, 实现整表排序,每趟的过程类似于“气泡”在水中不断上浮到水面的经过。
【步骤】

  1. 第1趟比较交换, 共有n-1对相邻数据进行比较
    一旦经过最大项,则最大项会一路交换到达最后一项
  2. 第2趟比较交换时, 最大项已经就位, 需要排序的数据减少为n-1, 共有n-2对相邻数据进行比较
  3. 直到第n-1趟完成后, 最小项一定在列表首位, 就无需再处理了。
    在这里插入图片描述
1.2 代码及复杂度分析

【代码】

def bubbleSort(alist):
    for pos in range(len(alist)-1, 0, -1):  #-1表示向前步进
        for i in range(pos):
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1]=alist[i+1],alist[i]  #python支持直接交换
alist = [23, 45, 12, 2, 23, 89, 54, 35]
bubbleSort(alist)
print(alist)
  • 算法过程总需要n-1趟, 随着趟数的增加, 比对次数逐步从n-1减少到1, 并包括可能发生的数据项交换。
  • 比对的时间复杂度是 O ( n 2 ) O(n^2) O(n2)
  • 冒泡排序通常作为时间效率较差的排序算法, 来作为其它算法的对比基准。
  • 但有一点优势, 就是无需任何额外的存储空间开销。
  • 另外, 通过监测每趟比对是否发生过交换, 可以提前确定排序是否完成

二、选择排序

2.1 算法思路及复杂度分析
  • 选择排序对冒泡排序进行了改进, 保留了其基本的多趟比对思路, 每趟都使当前最大项就位。
  • 但选择排序对交换进行了削减, 相比起冒泡排序进行多次交换, 每趟仅进行1次交换, 记录最大项的所在位置, 最后再跟本趟最后一项交换

【步骤】

  1. 从待排序的数据元素中选出最大的一个元素,存放在序列的末尾位置
  2. 再从剩余的未排序元素中寻找到最大元素,然后放到已排序的序列的首段
  3. 从待排序的数据元素中选出最小的一个元素,存放在序列的首段位置
  4. 再从剩余的未排序元素中寻找到最小元素,然后放到已排序的序列的尾部

图为第二种情况:
在这里插入图片描述【代码】

def selectionSort(alist):
    for pos in range(len(alist)-1, 0, -1):
        posofMax = 0
        for loc in range(1, pos+1):  #找出最大值
            if alist[loc] > alist[posofMax]:
                posofMax = loc
        alist[pos],alist[posofMax]=alist[posofMax],alist[pos] #将最大值往后排
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值