一、 快速排序!!!!
写了好几遍了,今天写竟然还有问题,我大概是脑子瓦特了。
快速排序要注意的点:
快速排序的思想:
- 分治的思想
首先找到一个pivot,希望在一个位置上,左边的值都小于pivot,右边的值都大于pivot, 递归执行,也就是每次都变得更有序。 - 如何将左边和右边变的有序
left和right是两端,首先从右端开始移动,找到第一个小于pivot的 数停下,然后左端标兵出发,找到大于pivot的停下,交换,直至相遇。 -
为什么右边标兵先出发?!!!!
因为右边先出发,最后i和j相遇时,才能保证右边的标兵所在的位置,是小于pivot的,这样才能与我们的pivot进行交换,将更小的值交换到左边。
- 因为是递归,要有返回条件,那么在快排中,什么时候是边界呢,当left>=right,说明是空或者只有一个元素,不需要排序,返回。
- 在所有的循环和判断中,都要加判断i < j, 注意没有等于,为什么没有等于呢,因为如果最大层while有等于,会陷入无限循环,当里面的循环有等于时,执行完等于,会是 i >j,导致错误。
- 每次一趟结束,要将pivot与j交换。
先上简洁版的代码:
def quickSort(aList, left, right):
if left >= right:
return
pivot = aList[left]
i = left
j = right
while i < j:
while aList[j] >= pivot and i < j:
j -= 1
while aList[i] <= pivot and i < j:
i += 1
if i < j:
aList[i], aList[j] = aList[j], aList[i]
aList[left], aList[j] = aList[j], aList[left]
quickSort(aList, left, j-1)
quickSort(aList, j+1, right)