python快速排序

时间:2022-07-23
本文章向大家介绍python快速排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//

python小程序

//

晚上没事儿干,用python写了个快排小程序,分享出来看看:

快速排序:

#! /usr/bin/env python
# -*- coding:utf8 -*-
from random import randrange, shuffle


'''
基本思想:
通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。

基本流程:通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。

稳定性:不稳定

复杂度:在最坏情况下是O(N^2),平均的时间复杂度是O(N*lgN)
'''

# 自动生成list
def generate_array():
    array = []
    while len(array) < 12:
        array.append(randrange(0, 101, 3))
    print("before sort array is {}".format(array))
    shuffle(array)
    return array


def quick_sort(array, head, tail):
    # 如果head > tail 则直接返回
    if head >= tail:
        return array
    # 否则进行排序
    else:
        start, end = head, tail
        base = array[start]  # 设置基准数为左侧数字
        while start < end:
            # 从右边开始判断,如果列表右边的数比基准数大或者相等
            while start < end and array[end] >= base:
                end = end-1   # 不进行操作,将end向前移动一位
            # 如果找到不满足条件的数字,则把end的数字复制给start
            array[start] = array[end]

            # 同样的方法比较前半区
            while start < end and array[start] <= base:
                start = start+1
            array[end] = array[start]
        # 这轮比较做完之后,列表被分成了两个半区,此时start=end
        array[start] = base  # 或者array[end]=base也可以
        print("middle result is {0},base is {1}".format(array, base))
        quick_sort(array, head, start-1)
        quick_sort(array, start+1, tail)
    return array


arr = generate_array()
result = quick_sort(arr, 0, len(arr)-1)
print("after sort is {}".format(result))

输出结果如下,其中base是每一次交换使用的基准数字:

before sort array is [96, 6, 63, 63, 51, 75, 63, 12, 0, 39, 33, 0]
middle result is [12, 6, 63, 39, 33, 0, 63, 0, 51, 63, 96, 75],base is 63
middle result is [0, 6, 0, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 12
middle result is [0, 6, 0, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 0
middle result is [0, 0, 6, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 6
middle result is [0, 0, 6, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 33
middle result is [0, 0, 6, 12, 33, 39, 63, 63, 51, 63, 96, 75],base is 39
middle result is [0, 0, 6, 12, 33, 39, 51, 63, 63, 63, 96, 75],base is 63
middle result is [0, 0, 6, 12, 33, 39, 51, 63, 63, 63, 96, 75],base is 51
middle result is [0, 0, 6, 12, 33, 39, 51, 63, 63, 63, 75, 96],base is 96
after sort is [0, 0, 6, 12, 33, 39, 51, 63, 63, 63, 75, 96]