01
目标
目标: 利用快速排序实现列表里的值从小到大排序
02
流程
流程:
03
基本思想
基本思想:
在将要排序的序列中任意选取一个值作为基数
然后通过第一次排序把序列分割成两个独立的部分
其中一部分的所有数据都要比基数小
另外一部分的所有数据都要比基数大
再通过递归操作对这两部分的数据重复进行以上操作
以此达到将无序序列变成有序序列的目的
04
图例
图例:
第一次画图,好丑啊
05
代码思路
代码思路:
在这里,我简称快速排序为快排。
根据快排的基本思想,可知快排过程中需要有递归操作,因此我们需要自定义一个函数qsort()用于包装代码
因为经过第一次排序后,我把序列分成三个部分:一部分是比基数小的数据组成的序列,一部分是比基数大的数据组成的序列,还有一部分是基数本身或者跟基数相等的数据组成的序列
为了便于区分这些序列,我这里对这三部分分别建了相应的列表left_base \ equal_base \ right_base,用于存储对应的数据
然后对 left_base 和 right_base 这两部分进行递归处理
最后将这三部分用拼接符“+”进行拼接,最终获取快排后的结果
06
编写代码
编写函数代码:
import random #导入随机模块
def qsort(List): #需传入一个列表参数
if len(List)>=2: #判断列表里元素的个数,两个或两个以上才有排序的意义
base = random.choice(List) #随机选取一个基数
left_base = [] #比基数小的部分
right_base = [] #比基数大的部分
equal = [] #跟基数相等部分
for num in range(len(List)): #遍历列表
if List[num]<base: #将元素里的值与基数进行判断
left_base.append(List[num]) #向列表里添加值
elif List[num]>base:
right_base.append(List[num])
else:
equal.append(List[num])
return qsort(left_base)+equal+qsort(right_base) #对左右部分进行递归处理并返回快排的最终结果
else:
return List #如果列表只有一个值得话,直接返回列表,无需排序
07
验证代码
验证代码:
一个列表里的值可能会出现三种情况:
所以下面对这三种情况分别验证
if __name__ == '__main__':
List = [[2],[2,6,3,7,9,1,5],[2,2,6,6,3,8,1,9]]
for i in List:
try:
result = qsort(i)
print(result)
print("排序成功\n")
except:
print("排序失败\n")
08
运行结果
运行结果:
09
请思考
请思考: