冒泡排序
冒泡排序原理:同一个列表,分别取出“当前值(假设: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还是会进行排序,计算器可不会有人的主观判断,并不会知道这个列表已经是有序的。那么,冒泡的优化版…
设计如下:
- 本来我是想大段文字描述的,不会发现还是直接上代码比较好,谅解下博主的水平有限
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:就是先遍历所有条件(可以理解是从前到后),当递归函数被终止时, 返回值就是从后向前返回,返回值的结果一般都是直接相加的。
码字很累,暂写到这里