归并排序
首先 我们认为若一个数组中只有一个数,我们默认这个数组有序
合并两个有序数组
合并两个有序数组,使得合并后的数组依旧有序
def jarray(ret1, ret2):
temp = []
r1, r2 = 0, 0
while r1 < len(ret1) and r2 < len(ret2):
if ret1[r1] > ret2[r2]:
temp.append(ret2[r2])
r2 += 1
else:
temp.append(ret1[r1])
r1 += 1
temp += ret1[r1:]
temp += ret2[r2:]
return temp
归并排序的意思就是 将一个数组分割为多个长度为1的数组,再将这些数组不断的合并为新的数组,从而使得数组有序,即分治思想。
综上所述
# 归并排序
def merge_sort(lis):
n = len(lis) # 获取列表的长度
if n <= 1:
return lis
mid = n // 2 # 获取列表中间的下表
# 将列表一分为二,分别获取左边的列表和右边的列表
left = lis[:mid]
right = lis[mid:]
# 调用函数,继续将列表一分为二,停止条件是:长度为1的时候,就不再继续分了
left = merge_sort(left) # left接收的是归并排序后形成的新列表
right = merge_sort(right) # right接收的是归并排序后形成的新列表
temp = jarray(left, right)
return temp
归并排序的稳定差,因为程序在不断开辟新的数组。
快速排序
def quick_sort(tar, left, right):
'''
:param tar: 目标数组
:param left: 逻辑起始位置
:param right: 逻辑最后位置
:return:
'''
if left > right:
return
# 两变量
i = left
j = right
# 基准数
base = tar[left]
while i != j:
# 从右向左找 比base小的数 找到停下
while j > i and tar[j] >= base:
j -= 1
# 从左向右找 比base大的数 找到停下
while j > i and tar[i] <= base:
i += 1
# 交换 两个数的位置
tar[i], tar[j] = tar[j], tar[i]
# 循环结束 把base的值和tar[i]的值交换
tar[left] = tar[i]
tar[i] = base
#
quick_sort(tar, left, i - 1)
quick_sort(tar, i + 1, right)
快速排序的意思就是 在数组中寻找一个基准数,一般为第一个数,然后在数组中分别寻找大于这个基准数的数和小于这个基准数的数,然后将其按照规则分布在两边,再不断重复,换不同的基准数,从而达到排序的效果。
如果有错误或者问题,请在评论区指出和讨论,谢谢
纸上得来终觉浅,绝知此事要躬行