快速排序

在一个数组中随便找数组中的一个数,比其小的数放到左侧,比其大的数放到右侧
1.最基础的快速排序
设置两个指针,挑一个数为‘基数’(一般为第一个数字),用x将其记录,right指针从右到左移动,left指针从左到右移动,先用右指针对应的值和基数比较,当其比基数小的时候,将基数的值和右指针对应的值进行交换(相反直接移动右指针),然后移动左指针,对应值和基数进行对比,当其比基数大的时候,将right对应的值和left 对应的值进行交换,直到right和left相等的时候,将其对应的值变为x利用列表的可变性

 def quick_sort(array, first, end):
    """快速排序"""
    if first >= end:
        return
    low = first
    high = end
    primary = array[first]
    while low < high:
        while low < high:
            if primary <= array[high]:
                high -= 1
            else:
                array[low] = array[high]
                break
        low += 1
        while low < high:
            if primary > array[low]:
                low += 1
            else:
                array[high] = array[low]
                break
    array[high] = primary

    quick_sort(array, first, high-1)
    quick_sort(array, high+1, end)

if __name__ == "__main__":
    lis = [49, 38, 65, 97, 76, 13, 27, 49]
    quick_sort(lis, 0, len(lis) - 1)
    print(lis)
# 最优时间复杂度:O(nlogn)
# 最坏时间复杂度:O(n2)
2.改进后的快排
def quickSort(array, first, end):
    # 改进后的快速排序
    if array is None or len(array) < 2:
        return

    left = first-1
    right = end

    cur = first
    while cur+1 == right:
        if array[cur] < array[end]:
            array[left + 1], array[cur] = array[cur], array[left + 1]
            left += 1
            cur += 1
        elif array[cur] == array[end]:
            cur += 1
        else:
            array[right-1], array[cur] = array[cur], array[right-1]
            right -= 1
    array[end], array[right] = array[right], array[end]
    quickSort(array[:left], 0, len(array) - 1)
    quickSort(array[:left], 0, len(array) - 1)

if __name__ == "__main__":
    lis = [49, 38, 65, 97, 76, 13, 27, 49]
    quickSort(lis, 0, len(lis) - 1)
    print(lis)
3.荷兰国旗问题(用快排)
def holland(array):
    left, cur, right = -1, 0, len(array) - 1
    end = len(array) - 1
    for i in range(2):
        while cur < right:
            if array[cur] > array[end]:
                array[cur], array[right-1] = array[right-1], array[cur]
                right -= 1
            elif array[cur] < array[end]:
                array[cur], array[left+1] = array[left+1], array[cur]
                left += 1
                cur += 1
            else:
                cur += 1
        array[end], array[cur] = array[cur], array[end]
        left, cur, right = left, left+1, len(array[left+1:]) - 1
        end = len(array[left+1:]) - 1
    return array

a = [0,2,1,2,2,1,1,0,2,1,0]
print(holland(a))

更多详情请点击

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值