Python 排序算法详解

冒泡排序

冒泡排序原理:同一个列表,分别取出“当前值(假设:i)”和“上一个值(假设:i - 1)”进行比较,当“上一个值”大于“当前值”的时候,进行位置的互换。

代码如下:

def mp(lists):
	for i in range(len(lists)):  # 循环lists取当前值i
		for j in range(len(lists) -1):  # 循环lists取 i 的上一个值 j
			if lists[j] > lists[i]:	# 当 j 比 i 大的时候,说明需要进行位置的互换 
				lists[i], lists[j] = lists[j], lists[i] # 对换位置
	return lists

print(mp([2,4,64,1,3151,1]))

问题来了:如果lists列表是一个本身就是有序的列表,那么当lists长度无限长的时候,这个lists还是会进行排序,计算器可不会有人的主观判断,并不会知道这个列表已经是有序的。那么,冒泡的优化版

设计如下:

  1. 本来我是想大段文字描述的,不会发现还是直接上代码比较好,谅解下博主的水平有限
def mp(lists):
	for i in range(len(lists)):  # 循环lists取当前值i
		flag = Flase  # 控制列表循环终止字段
		for j in range(len(lists) -1):  # 循环lists取 i 的上一个值 j
			if lists[j] > lists[i]:	# 当 j 比 i 大的时候,说明需要进行位置的互换 
				lists[i], lists[j] = lists[j], lists[i] # 对换位置
				flag = True  # 当  j 和 i 的位置进行了互换,则表示列表还在排序中
		if not flag:
			return lists # 当 j 和 i 的值不进行互换,表示当前lists已经是有序的,无需再循环排序
	return lists

print(mp([2,4,64,1,3151,1]))

快速排序+递归函数

快排的原理:取一个列表名为 lists. 截取lists索引为一半的时候的值 i:(len(lists) // 2),用这个值做基数,对左对右分别进行比较

好了,水平有限,废话不多说,直接上daam:

def dgkp(lists):
	if len(lists) < 1:  #控制返回排序后的lists返回
		return lists
	data = lists[len(lists) // 2]  # 取lists列表索引一半的值,作为向左向右循环的分界线
	left = [i for i in lists if i < data]  # 取lists列表循环中小于分界线值的值
	data_lists = [i for i in lists if i == data]  # 取lists列表循环中等于分界线值的值
	right = [i for i in lists if i > data]  # 取lists列表循环中大于分界线值的值
	return dgkp(left) + data_lists + dgkp(right) # 递归函数的妙用

递归函数的实现递归函数的基础定义是:在一个函数内部使用了自身。 递归函数的返回值return:就是先遍历所有条件(可以理解是从前到后),当递归函数被终止时, 返回值就是从后向前返回,返回值的结果一般都是直接相加的。

码字很累,暂写到这里

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值