<学习笔记>排序算法1-3:冒泡排序+选择排序+插入排序(2020.7.29)

1. 冒泡排序

  • 冒泡排序: 相邻元素两两比较,大的往后放,第一次完毕后最大值就出现在最大索引处,同理,继续,即可得到一个排好序得数组
    在这里插入图片描述
    在这里插入图片描述

规律

  • (1)两两比较,大的向后放
  • (2)每一次比较完成后,下一次比较就会减少一个元素得比较
  • (3)第一次比较,有0个元素不比
    • 第二次比较,有1个元素不比
    • 第三次比较,有两个元素不比
  • (4)总共需要比较数组长度-1次
# 冒泡算法
# 列表元素两两比较大的值向后移动
def  bubbleSort(alist):
	# 外层循环第一次,内层循环4次;外层循环第二次,内层循环3次;外层循环第三次,内层循环2次.
    for j in range(len(alist) - 1): 
        # 首先两两比较,将最大得值移至末尾,需要比较4次
        # 下面得操作第一次用在n个数上,第二次用在前n-1,第三次用在前n-2个数上
        for i in range(len(alist) - 1 - j):
            if alist[i] > alist[i + 1]:
                alist[i], alist[i + 1] = alist[i + 1], alist[i] # 换位
    return alist


alist = [3, 8, 5, 7, 6]
print(sort(alist))

2. 选择排序

在这里插入图片描述

在这里插入图片描述
上面动画是按最小排序,也可以按最大排
思想:假如有n个乱序元素.设置初始最大值索引为0,然后两两比较,更新最大值得索引,直到找到最大值,然后将这个最大值跟最后一个元素[n-1]交换位置;然后,找出前n-1最大值得索引,在与倒数第二个元素[n-2]交换位置

# 选择排序

# 将乱序中的最大值找出,跟最后一个元素交换位置
def sort(alist):

    for j in range(len(alist)-1):
        max_index = 0
        for i in range(1, len(alist)-j):
            if alist[max_index] < alist[i]:
                max_index = i # 找到所有值中最大值得下标
        alist[len(alist)-1-j], alist[max_index] = alist[max_index], alist[len(alist)-1-j]

    return alist

alist = [3, 8, 5, 7, 6]
print(sort(alist))

总结: 选择排序元素交换得次数要少于冒泡排序交换得次数。

3. 插入排序

思想: 每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好得列表段,最终获得排序好的列表,比如,待排序列表为[49, 38, 65, 97, 76, 13, 27, 49 ]则比较的步骤和得到得新列表如下:(带有背景颜色得列表段是已经排序好的,红色背景标记的是执行插入并且交换过得元素)

在这里插入图片描述
在这里插入图片描述

思路:[3,8,5,7,6]
(1):当i=1时,alist[i]可以理解为无序子集中的第一个元素8,alist[i-1] 可以理解为有序子集中的最后一个元素3,因为此是有序子集中只含有一个元素,那么当alist[i]<alist[i-1],交换顺序,i = i+1移位即可;当alist[i]>alist[i-1],则只需保持位置然后更新i,i = i+1移位即可。结果是有序子集变为[3,8],无序子集中变为[5,7,6]。
(2):当i=2时,若alist[i]<alist[i-1]即5<8,这时不能简单交换顺序,因为还要判断5是否比3大还是比3小,所以此时i的更新应该时i = i-1,这样下次循环比较的时候为alist[1]<alist[0]即5与3进行比较,根据情况然后在决定是否交换位置,循环的条件是i大于0。

'''
# 插入排序算法
alist = [3, 8, 5, 7, 6]
# 有序子集中元素的个数,还可以表示为下标
i = 1
# alist[i]可以理解为无序子集中的第一个元素
# alist[i-1] 可以理解为有序子集中的最后一个元素
if alist[i] < alist[i-1]: # 乱序子集中的第一个元素值小于有序子集中最后一个元素的值,交换位置
    alist[i], alist[i-1] = alist[i-1], alist[i]
else: # 乱序子集中的第一个元素值大于有序子集中最后一个元素的值,位置不变
    pass
i = i+1 # 以上两种情况都需要进行i的移位

i = 2
while i > 0:
    if alist[i] < alist[i-1]:
        alist[i], alist[i - 1] = alist[i - 1], alist[i]
        i-=1 # 在有序子集中进行比较,向前更新i
    else:  
        break
'''
# 完整代码

def insertionSort(alist):
    for i in range(1, len(alist)): # 第一个元素默认在有序子集中,剩余n-1个元素需要插,所以循环n-1次即可
        while i > 0:
            if alist[i] < alist[i - 1]:
                alist[i], alist[i - 1] = alist[i - 1], alist[i]
                i -= 1
            else:
                break
    return alist

alist = [3, 8, 5, 7, 6]
print(insertionSort(alist))
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值