3.1 問題
創建qsort.py文件,實現以下目標:
隨機生成10個數字
利用遞歸,實現快速排序
3.2 方案
將要排序的數據分割成獨立的三部分,任意選取一個數據作爲關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱爲一趟快速排序,整個排序過程通過遞歸進行,以此達到整個數據變成有序序列。
一趟快速排序的算法是:
1.創建兩個空列表分別用於存放比關鍵數小的數據和比關鍵數大的數據smaller和larger
2.For循環遍歷將要排序的數據,將數據與關鍵數對比,比關鍵數小的放入smaller列表中,比關鍵數大的放入larger列表中
3.函數返回值爲,以smaller列表爲參數調用自身函數、關鍵數、以larger列表爲參數調用自身函數:此時,函數每一次調用都會基於上一次的調用進行,會持續調用自身函數,參數列表數據會越來越少,我們規定,參數列表長度爲0或1,遞歸結束,輸出最終數據
4.注意:在調用qsort函數時,根據上傳數據類型不同,一定要注意數據類型轉化
3.3 步驟
實現此案例需要按照如下步驟進行。
步驟一:編寫腳本
[root@localhost day05] # vim qsort.py
#!/usr/bin/env python3
from random import randint
def qsort(data):
data = list(data)
if len(data) == 0 or len(data) == 1: # 長度爲0或1,直接返回
return data
middle = data.pop() # 假設最後一項是中間值
smaller = []
larger = []
for item in data:
if item > middle: # 比middle大的放到larger,否則放到smaller
larger.append(item)
else:
smaller.append(item)
return qsort(smaller) + [middle] + qsort(larger)
if __name__ == '__main__':
nums = [randint(1, 100) for i in range(10)]
print(nums)
print(qsort(nums))
astr = 'qwertyuio'
print(''.join(qsort(astr)))
atuple = (10, 2, 34, 234, 1, 66, 88, 77)
print(tuple(qsort(atuple)))
步驟二:測試腳本執行
[root@localhost day06]# python3 qsort.py
[31, 87, 88, 22, 26, 91, 99, 6, 7, 44]
[6, 7, 22, 26, 31, 44, 87, 88, 91, 99]
eioqrtuwy
(1, 2, 10, 34, 66, 77, 88, 234)