Python-排序算法-冒泡/选择/插入排序

冒泡排序

冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字
的位置”这一操作的算法。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的
顶端,所以这个算法才被称为“冒泡排序”。

    1. 比较相邻元素, 如果第一个比第二个大, 就交换他们两个
    1. 对每一对相邻的元素做同样的工作, 执行完毕后, 找到第一个最大值
    1. 重复以上步骤, 每次比较 次数 - 1, 直到不需要比较









在冒泡排序中,第 1 轮需要比较 n -1 次,第 2 轮需要比较 n -2 次……第 n -1 轮需
要比较 1 次。因此,总的比较次数为 (n -1) +(n -2) +…+1 ≈ n^2
/2。这个比较次数恒定为该数值,和输入数据的排列顺序无关。
不过,交换数字的次数和输入数据的排列顺序有关。假设出现某种极端情况,如输
入数据正好以从小到大的顺序排列,那么便不需要任何交换操作;反过来,输入数据要
是以从大到小的顺序排列,那么每次比较数字后便都要进行交换。因此,冒泡排序的时
间复杂度为 O(n^2)。

  • 一轮循环版本
ls = [5, 9, 3, 1, 2, 8, 4, 7, 6]
def bubbleSort(ls):
    for j in range(len(ls)-1, 0, -1):
        if ls[j - 1] > ls[j]:
            ls[j - 1], ls[j] = ls[j], ls[j - 1]
    for j in range(len(ls) - 1, 0, -1):
        if ls[j - 1] > ls[j]:
            ls[j - 1], ls[j] = ls[j], ls[j - 1]
    for j in range(len(ls) - 1, 0, -1):
        if ls[j - 1] > ls[j]:
            ls[j - 1], ls[j] = ls[j], ls[j - 1]
    for j in range(len(ls) - 1, 0, -1):
        if ls[j - 1] > ls[j]:
            ls[j - 1], ls[j] = ls[j], ls[j - 1]
    for j in range(len(ls) - 1, 0, -1):
        if ls[j - 1] > ls[j]:
            ls[j - 1], ls[j] = ls[j], ls[j - 1]
    return ls

print(bubbleSort(ls))

在这里插入图片描述
完整版

ls = [5, 9, 3, 1, 2, 8, 4, 7, 6]
def bubbleSort(ls):
    for i in range(len(ls) -1):
        for j in range(len(ls) - 1, i, -1):
            if ls[j - 1] > ls[j]:
               ls[j - 1], ls[j] = ls[j], ls[j - 1]
    return ls
print(bubbleSort(ls))

选择排序(Selection-Sort)

先把最小的拿出来
剩下的, 再把最小的拿出来
剩下的, 再把最小的拿出来
。。。
每次选择还没处理的元素里最小的元素

选择排序就是重复“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换”这一操作的算法。在序列中寻找最小值时使用的是线性查找。

比如: 对数字1~9进行排序。 使用线性查找在数据中寻找最小值,于是我们找到了最小值 1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


ls = [6, 1, 7, 8, 9, 3, 5, 4, 2]
def selectionSort(ls):
    for i in range(len(ls)):
        minIndex = i
        for j in range(i+1, len(ls)):
            if ls[minIndex] > ls[j]:
                minIndex = j
        if i != minIndex:
            ls[i], ls[minIndex] = ls[minIndex], ls[i]
    return(ls)
print(selectionSort(ls))

插入排序

在这里插入图片描述
每次处理一张牌, 把这张牌插入到前面已经排好序的牌中
插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插人排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插人到已排序区域内合适的位置上。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ls = [5, 3, 4, 7, 2, 8, 6, 9, 1]
def insertSort(ls):
    #  外层循环代表我已经拿到了第i个值, 正要准备插入到哪里
    for i in range(len(ls)):
        j = i
        while j - 1 >= 0:
            if ls[j] < ls[j - 1]:
                ls[j], ls[j - 1] = ls[j - 1], ls[j]
            else:
                break
            j -= 1
    return ls

print(insertSort(ls))

第二种写法

nums = [5,3,6,4,1,2,8,7] 
for i in range(1, len(nums)): 		#遍历未排序的元素
   for j in range(i):           		#遍历已有序的元素
      if nums[j]>nums[i]: 			#找到插入位置 
         ins = nums[i]
         nums.pop(i)        
         nums.insert(j, ins)
         break 					#完成插入后跳出for循环
print(nums)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值