快速排序

平均时间复杂度: nlogn

最为常用的排序算法

复制代码
def quick_sort(data, start, end):
    # 快排原地排序,直接对原list排序,没有返回值
    if start>=end:
        return
    # 开始结束索引不能破坏
    left, right = start, end
    mid = start + (end-start)//2
    # 避免最坏情况出现
    pivot = data[mid]
    while left <= right:
        while left <= right and data[left]<pivot:
            left += 1
        while left <= right and data[right]>pivot:
            right -= 1
        # 两头找到均不满足条件的数,需要互换区间
        if left <= right:
            data[left], data[right] = data[right], data[left]
            left += 1
            right -= 1
    # 小范围内再排序
    quick_sort(data, start, right)
    quick_sort(data, left, end)
nums = [33,2,11,8,7,12]
quick_sort(nums, 0, len(nums)-1)
nums
复制代码

 

复制代码
def quick_sort(data, start, end):
    # 快排原地排序,直接对原list排序,没有返回值
    if start>=end:
        return
    # 开始结束索引不能破坏
    left, right = start, end
    mid = start + (end-start)//2
    # 避免最坏情况出现
    pivot = data[mid]
    while left <= right:
        print("###",left, right, data)
        while left <= right and data[left]<pivot:
            left += 1
        while left <= right and data[right]>pivot:
            right -= 1
        # 两头找到均不满足条件的数,需要互换区间
        if left <= right:
            data[left], data[right] = data[right], data[left]
            left += 1
            right -= 1
#     print(start, right)
    # 小范围内再排序,上层循环的停止条件是right<left,所以此时最左端是right,右端是left
    quick_sort(data, start, right)
    quick_sort(data, left, end)
nums = [33,2,11,8,7,12]
quick_sort(nums, 0, len(nums)-1)
nums 
复制代码

v3

复制代码
class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        if not nums:
            return
        self.quick_sort(nums, 0, len(nums)-1)
        return nums
    def quick_sort(self, nums, start, end):
        if start >= end:
            return
        left, right = start, end
        mid = start + (end-start)//2
        piovt = nums[mid]
        while left <= right:
            while left <= right and nums[left]<piovt:
                left += 1
            while left <= right and nums[right]>piovt:
                right -= 1
            if left <= right:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1
                right -= 1
        self.quick_sort(nums, start, right)
        self.quick_sort(nums, left, end)
复制代码

 

posted @   今夜无风  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示