快速排序

一个简单,耗时的快排,

def querysocrt(array):
    if len(array) < 2:
        return array
    privo = array[0]
    less = [i for i in array[1:] if i <= privo]
    greate = [i for in in array[1:] if i > privo]
    return querysocrt(less) + [privo] + querysocrt(greate)

本质就是利用二分法,不断把给定的数组划分为两组。
1,取第一个元素p,并定义两个变量分别定义第一个元素和最后一个元素,
2,把基准数p大的放在右边,比基准数p小的放在左边
3,首先把第一个元素定义为基准元素,出现一个空位,从数组的右边向左开始查找小于基准数的元素,并与空位互换
4,换好位置后,从数组左边向右边查找比基准数大的元素,同样与空位互换
5,现在有开始从右边向左边找,
6,不断重复,直到分成两个分区,再把基准数添入空位,这样第一趟完成
7,这样对分好的两个区间重复上述的操作,直到每一个区间只有一个元素为止
代码

def partition(arr, low, high):
    i = (low - 1)  # 最小元素索引
    pivot = arr[high]

    for j in range(low, high):

        # 当前元素小于或等于 pivot
        if arr[j] <= pivot:
            i = i + 1
            arr[i], arr[j] = arr[j], arr[i]

    arr[i + 1], arr[high] = arr[high], arr[i + 1]
    return (i + 1)


def _quickSort(arr, low, high):
    """
    :param arr: 需要排序数组
    :param low: 起始索引
    :param high: 结束索引
    :return:
    """
    if low < high:
        pi = partition(arr, low, high)
        _quickSort(arr, low, pi - 1)
        _quickSort(arr, pi + 1, high)


def quickSort(arr):
    _quickSort(arr, 0, len(arr) - 1)


arr = [10, 7, 8, 9, 1, 5]
quickSort(arr)
print(f"排序后的数组:{arr}")

时间复杂度 O(nlogn)
递归最大深度 1000层
最坏情况 当列表为一个从大到小的时候,时间复杂度 O(n的平方)

posted @ 2021-12-01 00:02  下个ID见  阅读(56)  评论(0)    收藏  举报