快速排序

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。partition算法的时间复杂度是O(n),一共进行logn次递归,所以时间复杂度是nlogn。在快排中,相等元素可能会因为分区而交换顺序,所以它是不稳定的算法

动态效果示意图:

æåºï¼4ï¼ï¼å¿«éæåº

æåºï¼4ï¼ï¼å¿«éæåº

上图中,演示了快速排序的处理过程:

初始状态为一组无序的数组:2、4、5、1、3。

经过以上操作步骤后,完成了第一次的排序,得到新的数组:1、2、5、4、3。

新的数组中,以2为分割点,左边都是比2小的数,右边都是比2大的数。

因为2已经在数组中找到了合适的位置,所以不用再动。

2左边的数组只有一个元素1,所以显然不用再排序,位置也被确定。(注:这种情况时,left指针和right指针显然是重合的。因此在代码中,我们可以通过设置判定条件left必须小于right,如果不满足,则不用排序了)。

而对于2右边的数组5、4、3,设置left指向5,right指向3,开始继续重复图中的一、二、三、四步骤,对新的数组进行排序。

def quicksort(input_list):
    if len(input_list) == 0:
        return []
    length = len(input_list)
    start = 0
    end = length - 1
    partition(input_list, start, end)
    return input_list

def partition(input_list, start, end):
    if end <= start:
        return start
    base = input_list[start]
    index1, index2 = start, end
    while start < end:
        while start < end and input_list[end] >= base:
            end -= 1
        input_list[start] = input_list[end]
        while start < end and input_list[start] <= base:
            start += 1
        input_list[end] = input_list[start]
    input_list[start] = base
    partition(input_list, index1, start-1)
    partition(input_list, start+1, index2)

if __name__ == '__main__':
    input_list = [6, 4, 8, 9, 2, 3, 1]
    print('排序前:', input_list)
    quicksort(input_list)
    print('排序后:', input_list)

快排的非递归形式,用栈实现:

def quicksort(input_list):
    '''''
    模拟栈操作实现非递归的快速排序 没有返回值 已经在input_list中修改好了
    '''
    if len(input_list) == 0:
        return []
    stack = []
    stack.append(len(input_list) - 1)
    stack.append(0)
    while stack:
        l = stack.pop()
        r = stack.pop()
        index = partition(input_list, l, r)
        print(input_list)
        if l < index - 1:
            stack.append(index - 1)
            stack.append(l)
        if r > index + 1:
            stack.append(r)
            stack.append(index + 1)

def partition(input_list, start, end):
    if end <= start:
        return start
    base = input_list[start]
    index1, index2 = start, end
    while start < end:
        while start < end and input_list[end] >= base:
            end -= 1
        input_list[start] = input_list[end]
        while start < end and input_list[start] <= base:
            start += 1
        input_list[end] = input_list[start]
    input_list[start] = base
    return start

if __name__ == '__main__':
    input_list = [2,8,3,0]
    print('排序前:', input_list)
    quicksort(input_list)
    print('排序后:', input_list)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值