Python---快速排序

快速排序思想:在一组无序的数中,以第一个数作为关键数据,第一次排序找到比它小的放它左边,比它大的放它右边,完成一趟快速排序,再将排好的数据折半,进行递归操作(即利用上面的方法)。

实现:

import random,time

def quick_sort(list,start,end):

    if start>=end:
        return
    k=list[start]
    left_flag=start
    right_flag=end

    while(left_flag<right_flag):  #当两旗子相碰说明每个数都与第一个数比较了一次   说明第一次快速排序完
        while(left_flag<right_flag and list[right_flag]>k):   # 右旗子值大于k,表明顺序正常,右旗子左移,直到遇到右旗子值小于k,则交换位置
            right_flag-=1
        tmp=list[left_flag]   #有疑惑 为什么是left_flag  已解决  因为关键值在左旗子上
        list[left_flag]=list[right_flag]
        list[right_flag]=tmp

        while(left_flag<right_flag and list[left_flag]<=k): # 左旗子值小于k,表明顺序正常,左旗子右移,直到遇到左旗子值大于k,则交换位置
            left_flag+=1
        tmp = list[left_flag]  #有疑惑 为什么是right_flag   因为此时关键值在右旗子位置上
        list[left_flag] = list[right_flag]
        list[right_flag] = tmp

        print(list)



    quick_sort(list,start,left_flag-1)    #折半递归快速查找  对折半左边操作(折半左边还会进行折半,但会把左边的折半先计算完在回到右边)
     quick_sort(list,left_flag+1,end)   #对折半右边操作(折半右边还会有折半,但会把右边的折半计算完在逐一回到左边)   中间必须是left_flag+1而不是right_flag


if __name__=='__main__':
    list = []
    for i in range(50000):
        list.append(random.randrange(1000))
    print(list)
    start_time=time.time()
    quick_sort(list,0,len(list)-1)
    end_time=time.time()
    print("Cost time:",end_time-start_time)
快速排序每次将待排序数组分为两个部分,在理想状况下,每一次都将待排序数组划分成等长两个部分,则需要logn次划分。
而在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,快速排序将不幸退化为冒泡排序,所以快速排序时间复杂度下界为O(nlogn),最坏情况为O(n^2)。在实际应用中,快速排序的平均时间复杂度为O(nlogn)。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值