1. 程式人生 > >python 實現的 簡單的 快速排序 測試

python 實現的 簡單的 快速排序 測試

這裡是主程式,註釋比較詳細,就不多說啦 

import GenerateData
from random import uniform
import pickle
import sys,time
sys.setrecursionlimit(900)#不加這句話當操作的列表很大的時候會報錯,它用來設定允許的最大遞迴深度
GenerateData.GeneratList()#另外一個小指令碼,它會生成指定大小的數字列表並儲存在檔案中,執行一次後可以註釋
DGtimes =0#記錄遞迴呼叫次數的全域性變數

def QuickSortList(TheList):#快速排序的程式碼,修改於《演算法圖解》
    global DGtimes#這裡記錄遞迴呼叫的次數,為了好玩
    DGtimes+=1
    if len(TheList)<2:
        return TheList
    else:
        randomIndex = int(uniform(0,len(TheList)))
        Middle = TheList.pop(randomIndex)
        less = [i for i in TheList[0:] if i<=Middle]
        #print('less-',DGtimes,': ',less)
        greater= [i for i in TheList[0:] if i>Middle]
        #print('greater-',DGtimes,': ',greater)
        return QuickSortList(less)+[Middle]+QuickSortList(greater)
        
if __name__=='__main__':
    try:
        Datafile = open("C:/Users/Yun/Desktop/pythonTest/TaskData.txt",'rb')
        RandomValueList=pickle.load(Datafile)
        Datafile.close()
    except:
        print("can't onpen file, will regenerat Radom Data...")
        GenerateData.GeneratList()
        print('Data Regenerat Done, restart progeam')
        exit()
    print('Sorting...')
    SortTime = time.time()
    SortedList = QuickSortList(RandomValueList)
    SortTime = time.time() - SortTime
    print('the len of SortedList: ', len(SortedList))
    print('the sortTime: ', SortTime)
    print('DG-times: ', DGtimes)

這裡是生成隨機資料的模組GenerateData.py , 記得放在同一目錄下哦

from random import uniform
import pickle

RandomValueList_Account=10000
RandomValueList_range = (0,1000)

def GeneratList():
    print("Generating...")
    Datafile = open("C:/Users/Yun/Desktop/pythonTest/TaskData.txt",'wb')
    RandomValueList = []
    for x in range(RandomValueList_Account):
        RandomValueList.append(int(uniform(RandomValueList_range[0], RandomValueList_range[1])))
    pickle.dump(RandomValueList, Datafile, 0)
    Datafile.close()
    return

這裡有一個問題,我覺得遞迴呼叫的次數好多啊,有沒有更優化的選擇中止的方法呢?