獨白:
前幾天學的基本簡單排序算法,相對來說接受起來還是可以的,今天學的快速排序,視頻看了2遍加上自己的思考,才真正的研究明白。自己的編程思維在逐漸的形成,日后還需勤加練習。心得:越高級的算法,越是讓人難理解。為了追求算法時間的縮短,需要更多知識來進行支撐。
快速排序
快速排序(英語:Quicksort),又稱划分交換排序(partition-exchange sort),通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
步驟為:
- 從數列中挑出一個元素,稱為"基准"(pivot),
- 重新排序數列,所有元素比基准值小的擺放在基准前面,所有元素比基准值大的擺在基准的后面(相同的數可以到任一邊)。在這個分區結束之后,該基准就處於數列的中間位置。這個稱為分區(partition)操作。
- 遞歸地(recursive)把小於基准值元素的子數列和大於基准值元素的子數列排序。
遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個算法總會結束,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最后的位置去。
""" 快速排序 最優時間復雜度:O(nlogn) 最壞時間復雜度:O(n2) 穩定性:不穩定 """ import time import random def quick_sort(list, star, end): # 遞歸的退出條件 if star >= end: return # low為序列左邊的由左向右移動的游標 low = star # high 為序列右邊的由右向左移動的游標 high = end # 設定其實元素為要尋找位置的基准元素 mid_value = list[star] while low < high: # 如果low 與high 未重合,high 指向的元素不比基准元素小,則high向左移 while low < high and list[high] >= mid_value: high -= 1 # 將high 指向的元素放到low 的位置上 list[low] = list[high] # 如果low與high未重合,low指向的元素比基准元素小,low的向右移 while high > low and list[low] < mid_value: low += 1 # 將low指向的元素放到high的位置上 list[high] = list[low] # 退出循環后,low 與high重合,此時所指位置為基准元素的正確位置 # 循環退出時 將基准元素放到該位置 list[low] = mid_value # 對基准元素的左邊的子序列進行快速排序 quick_sort(list, star, low-1) # 對基准元素右邊的子序列進行快速排序 quick_sort(list, low+1, end) def new_num(lis): """隨機生成50個數加入列表中""" for i in range(50): j = random.randint(0,10000) lis.append(j) if __name__ == '__main__': first_time = time.time() # 空列表 lis = [] # 隨機函數添加到列表中 new_num(lis) # 列表排序 quick_sort(lis, 0, len(lis)-1) print(lis) # 結束時間 last_time = time.time() print("共用時%s" % (last_time - first_time))