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