快速排序

127 阅读3分钟

快速排序

快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出。

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列

采用的思想是:分治思想,即先解决部分从而解决整体

排序算法的思想非常简单,在待排序的数列中,我们首先要找一个数字作为基准数(这只是个专用名词)。为了方便,我们一般选择第 1 个数字作为基准数(其实选择第几个并没有关系)。接下来我们需要把这个待排序的数列中小于基准数的元素移动到待排序的数列的左边,把大于基准数的元素移动到待排序的数列的右边。这时,左右两个分区的元素就相对有序了;接着把两个分区的元素分别按照上面两种方法继续对每个分区找出基准数,然后移动,直到各个分区只有一个数时为止。

看文字可能还是有点难以理解,具体看代码也可以,代码里面也有注释

# 快速排序
# 将元素放到自己应有的位置,左边的数都比它小,右边的数都比它大
# 递归完成
'''
    时间复杂度,O(n*log(n)) (一般情况)
    快速排序的问题
        最坏情况   排一个倒叙的列表  解决方法,在列表中随机找一个数与第一个数进行交换
        递归  容易超过递归的最大深度


'''
import random
# import sys
# sys.setrecursionlimit(10000)   该表最大递归深度
'''
    快速排序
    快速排序思路
        取一个元素p(第一个元素),使元素p归位
        列表被p分为两个部分,左变都比p小右边都比大
        递归完成排序
'''

def partition(li, left, right):
    # 将最左边的元素给tmp
    tmp = li[left]
    while left < right:
        while left < right and li[right]>=tmp:  # 从右面找出比tmp小的数
            right -= 1
        li[left] = li[right]    # 将右边第一个小于tmp的数放到左边的空位上
        while left < right and li[left] <= tmp:   # 从左边找出比tmp大的数
            left += 1
        li[right] = li[left]   # 将左边第一个大于tmp的数放到右边刚才腾出来的空位上
    li[left] = tmp       # 将tmp归位,放到了左边全比它小,右面全比它大的位置,也就是它最后应在的位置
    return left      # 这个left代表的就是tmp位置的索引


def quick_sort(li, left, right):
    if left < right:  # 至少有两个元素,是判断递归是否停止的条件
        mid = partition(li, left, right)
        quick_sort(li,left, mid-1)
        quick_sort(li, mid+1,right)


li = list(range(10000))
random.shuffle(li)
quick_sort(li, 0, len(li)-1)
# 输出排序后的顺序
print(li)