排序

一、 快速排序!!!!

写了好几遍了,今天写竟然还有问题,我大概是脑子瓦特了。
快速排序要注意的点:
快速排序的思想:

  1. 分治的思想
    首先找到一个pivot,希望在一个位置上,左边的值都小于pivot,右边的值都大于pivot, 递归执行,也就是每次都变得更有序。
  2. 如何将左边和右边变的有序
    leftright是两端,首先从右端开始移动,找到第一个小于pivot的 数停下,然后左端标兵出发,找到大于pivot的停下,交换,直至相遇。
  3. 为什么右边标兵先出发?!!!!
    因为右边先出发,最后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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容