Python面试知识_排序

不管是python测试还是开发,在面试中常被考到排序,最常用的是冒泡排序,有的变态考题要用非冒泡排序,这里介绍三种排序方法

01冒泡排序

冒泡排序是最简单的,也是最容易理解的排序方法。思路就是一个数字依次对序列中的数据进行比较,一次比较2个数字,如果根据比较结果,判断是否需要交换位置

l1 = [1,4,5,9,76,5,43,21]

for i in range(0,len(l1)-1):
for j in range(0,len(l1)-i-1):
if l1[j] > l1[j+1]:
# temp = l1[j]
# l1[j] = l1[j+1]
# l1[j+1]= temp
l1[j],l1[j+1] = l1[j+1] ,l1[j]
print(l1)
例如我们要对列表l1进行排序,第一层循环负责列表中的每一个数,第二层循环负责数据比较,如果满足if条件就进行交换

在python中交换可以引入一个变量temp,三个变量直接相互交换,完成2数据的对调,代码中注释部分

在python中已可以使用l1[j],l1[j+1] = l1[j+1] ,l1[j]的方式,也是完成2个数据的对调

在循环的边界值方面,第一层循环要考虑到如果是每2个数据比较,最后一个数据就不用在去和它后面的比较了,因为它后面没有数据了,所以第一层循环范围(0,len(l1)-1)
第二层循环前面已经比过的数据,就不用再比较了,所以范围是range(0,len(l1)-i-1)

02选择排序

选择排序首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕

l1 = [1,8,3,9,4,43,21]
for i in range(len(l1)-1):
min = i
for j in range(i+1,len(l1)):
if l1[min] > l1[j]:
min = j
if min != i:
l1[min],l1[i] = l1[i],l1[min]
print(l1)
这里首先取第一元素的下标赋值给变量min,设定为最小的元素,然后从第二个元素开始依次和这个最小元素进行比较,如果比较满足if的条件,就把最小元素的下标赋值给min,一轮比较完成后,如果min和所比较的元素下标不同,就进行数据对调

03快排

快排从数列中挑出一个元素,称为 “基准”;

重新排序数列,所有元素比基准值小的摆放在基准前面,

所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。

在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作

递归地把小于基准值元素的子数列和大于基准值元素的子数列排序

def fun(list1):
if list1 == []:
return []
else:
first = list1[0]
less = fun([i for i in list1[1:] if i < first])
more = fun([j for j in list1[1:] if j > first])
return less + [first] + more
l1 = [5,4,15,9,76,5,43,21]
a = fun(l1)
print(a)

如果这篇文章对你有所启发,点赞、转发都是一种支持
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值