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)。


猜你喜欢

转载自blog.csdn.net/beifangdefengchuilai/article/details/80929455