公示:相关概念解释及动图来源于https://www.cnblogs.com/onepixel/articles/7674659.html
首先吐槽下上图,上图在我参考的那个教程里面,他标示的快速排序就是这张图,但是我看了很久,跟我下面说的处理流程不一样,但是核心思想是一样的,就是分大小区,再依次判断。
这里再附上一个正统的处理流程:来源于 →→→这里←←←
简单解释一下快速排序的原理:说是先任意选择一个数作为基数,但一般直接用第一个,简单干脆,遍历一遍数组,把大于或小于这个基数移到两边 ,再对这两边在进行一次大小分区,知道最后的分的区个数为1为止。
好,上算法,推荐一种超便捷的方法,超便捷对我来说只是代码量少点而已,哈哈。
# 为什么还要传start和end进来,主要是方面控制此次遍历的数组的起始和结尾,这样可以在子分区排序的时候可以递归调用。
def QuickSort(myList, start, end):
# 判断当首尾下边相等时,表示已经分好关于基数的大小区了,可结束排序
if start < end:
# 将start赋值给i,将end赋值给j
i, j = start, end
# 确定基值,默认为第一个
base = myList[i]
while i < j:
# 先从最后循环,查找比基数小的值
while (i < j) and (myList[j] >= base):
j = j - 1
# 找到之后 把这个小的值放在基数的位置,因为基数已经赋值给base了,所以现在比它小的放在前面
myList[i] = myList[j]
# 从前面开始遍历,但是由于上一步m[i](上一步找到比基数小的那个值)已经该变成m[j]的值,所以此时会进行一次i+1,而后面那句m[j]=m[i]是为了从前面遍历时找到比基数大的那个,必须要。
while (i < j) and (myList[i] <= base):
i = i + 1
# 将找到的比基数大的那个值放到j的位置
myList[j] = myList[i]
# 把此次排好序的基值赋值给在i处排完序的那个值,不用担心会造成数据错乱,这个是其实是上一个排序值的复制,现在只是排好了,该用原来的基数代替回来,所以,经历过一次遍历之后的数组成为以基数为分割线,基数前面的是比它小的,后面是比它大的。
myList[i] = base
# 递归调用,第一个是递归比基数小的那部分,第二个是递归比基数大的那部分,这里其实i和j是同一个数,就像这样 [*,*,...,i-1,(i,j),j+1,...,*,*]
QuickSort(myList, start, i - 1)
QuickSort(myList, j + 1, end)
return myList
myList = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
print("Quick Sort: ")
QuickSort(myList, 0, len(myList) - 1)
print(myList)
看注释以便小白方便理解。
好了,这就是我对快速排序的理解。虽然还有另外的方式实现,你们研读一下就发现思路的核心是一样的。但是我懒,只想记住最简单的实现。。。