QQ:3020889729 小蔡
特别声明
本文采用jupyter notebook演示,请注意移植代码的整合问题。
排序优点
序号
优点
1
时间和内存使用良好,排序效果好。(在小数据排序时,冒泡可以替换)
2
是一种二分思想的体现,是二分堆排序学习的引导
算法思想
1.从一段需要排序的数据中选出基数
2.然后从两边开始按指定规则检测:从左到右为检测比基数(4)大的数,然后停下;从右到左为检测比基数(4)小的数,然后停下。将这两个交换后,继续检测操作——知道左右检测到同一个元素时,将基数与该元素交换,即完成一轮元素快排。
3.从以上图示可知,最终排序的数据会变成一个个确定的基数,进而完成排序。(算法实现采用递归完成,破除条件就是,左检测的下标等于右检测下标(不允许左检测大于右检测))
代码实现
处理输入数据
# 不定长数据排序
a = input("请输入待排序数据:").split(' ')
a = [int(x) for x in a] # 数据类型转换
n = len(a) # 数据长度
结果展示:
定义快排函数
提示:该函数调用全局的a变量
def quicksort(left, right): # 传入快排的起止下标
'''函数说明:
1.函数内采用全局变量实现数据修改
2.递归破除条件为左检测越过右检测时
3.每一次新划分总是从左边开始新的递归,再进行右部分的递归
'''
if left > right: # 递归破除条件:当左检测标号left》right时,破出
return
i = left # 快排的左下标,也是基数的下标
j = right # 快排的尾下标
t = a[left] # 基数值
while i != j: # 进行快排
while a[j] >= t and i < j: # 每一次快排总是先从右边开始检测小于基数的元素,否则标号减1
j -= 1
while a[i] <= t and i < j: # 检测大于基数的元素,否则标号加1
i += 1
if i < j: # 经过检测之后,如果此时的左右标号满足条件,就进行数据交换
temp = a[i]
a[i] = a[j]
a[j] = temp
a[left] = a[i] # 完成一次基数的排序,将基数和本次排序得到的中段值交换
a[i] = t
quicksort(left, i-1) # 通过递归实现整个排序,总是从每一次新划分的左边开始递归
quicksort(i+1, right) # 右划分递归
调用该函数,显示结果:
快排函数的输入参数修改
'''函数修改说明:
1.基于全局变量来定义函数在使用上不适合交互,所以改写为传入代排序数据
2.其余操作不变
'''
def quicksort_2(data, left, right):
if left > right:
return
i = left
j = right
t = data[left]
while i != j:
while data[j] >= t and i < j:
j -= 1
while data[i] <= t and i < j:
i += 1
if i < j:
temp = data[i]
data[i] = data[j]
data[j] = temp
data[left] = data[i]
data[i] = t
quicksort_2(data, left, i-1)
quicksort_2(data, i+1, right)
return data
调用函数的结果展示:
原文链接:https://blog.csdn.net/weixin_44604887/article/details/106364142