提要
记录学习快速排序算法时遇到的问题(基于Pyhton)
问题
- 主要接触了两种方法
- 从待排序列表中选出基准元素(任选),创建两个空列表a和b,将待排序的列表中每个元素与基准元素相比较,小于等于基本元素的从待排序列表移除添加进列表a,大于基本元素的从待排序列表移除并添加进列表b,最后拼接成一个列表即 a+基准元素+b ,再对列表a与列表b进行重复操作,直到列表中只剩下一个基准元素。
- 从待排序列表中选出基准元素(任选),设置两个游标a和b。a从列表最小索引移向最大索引,步长为1;b从列表最大索引移向最小索引,步长同样为1;首先移动b,在移动过程中寻找第一个小于基准元素的元素,然后停止;然后移动a,在移动过程中寻找第一个大于基准元素的元素,然后停止。最后将a与b找到的元素互换位置,进行下一次寻找。在移动过程中,若a与b相遇,则停止本次移动,进行下一次移动
- 主要问题
- 方法1(创建列表)虽然很好理解,但是在编写代码时遇到了一些障碍,递归函数实现总会遇到一些问题。
- 方法2(设置游标)在编写过程比较简单,但是由于实现方法太过于多样,很容易造成记忆混乱,而且初次接触时理解起来可能有一些难度
代码
方法2(设置游标)代码
# 快速排序
# 定义函数,传入参数为列表,左游标值以及右游标值
def quick_sort(list, left, right):
# 当左游标值 > 右游标值时退出函数(递归出口)
if left > right:
return -1
# 设置基准值
pivot = list[left]
i = left
j = right
# 首要条件,左右游标值不能相等
while i != j:
# 当j即右游标指向值大于等于基准值时且左游标值小于右游标值,右游标向左移动
while list[j] >= pivot and i < j:
j -= 1
# 当i即左游标指向值小于等于基准值时且左游标值小于右游标值,左游标向右移动
while list[i] <= pivot and i < j:
i += 1
# 双游标都停止后如果左游标值小于右游标值,则两游标所指向元素互换位置
if i < j:
list[i], list[j] = list[j], list[i]
# 将左游标的值赋值等于左游标最后停留的值
list[left] = list[i]
# 将左游标最后停留处的值赋值等于基准值
list[i] = pivot
# 分别对基准值左边以及右边的值进行排序
quick_sort(list, left, i - 1)
quick_sort(list, i + 1, right)
a = [4, 2, 7, 8, 0, 1, 5, 23, 78, 29]
quick_sort(a, 0, len(a)-1)
print(a)
总结
- 方法2掌握的并不理想,有几处还需思考
- 熟练方法2当前实现方法后尝试新的实现方法
- 尝试理解并实现方法1