Python-選擇排序

選擇排序算法

選擇排序雖然是效率不是很高的排序算法曲掰,不過它在我們編程的時候還是會經(jīng)常使用,出場次數(shù)有時候可能要比效率更高的那些算法更高辜贵。

首先咱們通過一個動圖來了解選擇排序的過程:

5863482636c750d9e5cb683374fba9d4.gif

通過這個動圖菱蔬,我們可以發(fā)現(xiàn)選擇排序的過程為:每次一輪遍歷都找到當前最小的元素并和未排序元素的第一個元素交換位置太闺。

接下來編寫代碼:


def sort(arr):
    for j in range(len(arr)-1):    
        minIndex = j
        for i in range(j+1,len(arr),1):
            if(arr[i] < arr[minIndex]):
                minIndex = i
        arr[j],arr[minIndex] = arr[minIndex],arr[j]

def main():
    arr = [3,1,2,4,6,7,8,9,5]
    sort(arr)
    print(arr)

if __name__ == "__main__":
    main()
    pass

執(zhí)行會輸出:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

使用隨機數(shù)生成測試用例

通過上面我們已經(jīng)掌握了選擇排序代碼的編寫了,不過我們會發(fā)現(xiàn)枢贿,上面代碼的測試數(shù)組太簡單了殉农,只有1-9,這么一段數(shù)據(jù)集太少了并不能測試我們編寫的排序算法到底靠不靠譜局荚。

那如何才能靠譜呢超凳?

你應(yīng)該已經(jīng)想到了:加大測試集,增加測試次數(shù)耀态,是的轮傍,沒錯,當我們數(shù)據(jù)量大首装,測試集非常多的時候這段程序如果依然能正確的進行排序创夜,那我們就可以判斷它是一個正確的排序算法了。

好了仙逻,問題來了驰吓,如何才能生成大量的數(shù)據(jù)集(比如說一萬條)呢?

手寫肯定是不行系奉,所以咱們需要通過程序幫我們生成棚瘟,接下來我們分兩步完成生成隨機測試用例并測試。

  1. 使用隨機數(shù)生成大量測試集喜最;
  2. 測試程序是否已經(jīng)是排好序的狀態(tài)偎蘸。
第一步:隨機生成1萬條測試用例

使用random模塊我們就可以生成隨機數(shù)了
利用random模塊的random.randint(a,b)方法就可以生成從ab的隨機數(shù)。
編寫代碼:

import random
def getRandomArr(num):
    arr = []
    for i in range(num):
        arr.append(random.randint(0,num))
    return arr

這段代碼可以生成num個從0num的隨機數(shù)瞬内。

第二部:測試代碼編寫

接下來我們需要編寫一個函數(shù)檢測數(shù)組是否已經(jīng)是排好序的迷雪。

def isSorted(arr):
    for i in range(len(arr)-1):
        if arr[i] > arr[i+1]:
            return False
    return True

完整代碼:


import random

def sort(arr):
    for j in range(len(arr)-1):    
        minIndex = j
        for i in range(j+1,len(arr),1):
            if(arr[i] < arr[minIndex]):
                minIndex = i
        arr[j],arr[minIndex] = arr[minIndex],arr[j]

def main():
    arr = getRandomArr(10000)  #測試一萬條數(shù)據(jù)
    sort(arr)
    
    print(isSorted(arr))#檢測是否排好序

#獲取隨機數(shù)
def getRandomArr(num):
    arr = []
    for i in range(num):
        arr.append(random.randint(0,num))
    return arr

#檢測是否已排序
def isSorted(arr):
    for i in range(len(arr)-1):
        if arr[i] > arr[i+1]:
            return False
    return True


if __name__ == "__main__":
    main()
    pass

這樣子我們就完成了一個選擇排序的編寫與測試啦。

繪圖查看選擇排序的算法執(zhí)行效率

僅僅掌握代碼怎么寫還不夠虫蝶,我們在深入一層章咧,接下來我們看看選擇排序的執(zhí)行效率,時間復(fù)雜度能真。

咱們在執(zhí)行代碼的時候發(fā)現(xiàn)當測試集數(shù)據(jù)量非常大的時候我們的程序非常慢赁严,其實選擇排序算是一種效率較低的排序算法扰柠,它的代碼執(zhí)行效率為:O(n^2)

要直觀的查看排序所花的時間我們只需要在排序獲取當前時間然后在排序之后獲取當前時間即可。

獲取當前時間使用到的是:datatime庫疼约,要獲取執(zhí)行的時間差卤档,需要四個步驟:

  1. 首先導(dǎo)入:import datatime

  2. 獲取開始時間,結(jié)束時間

  3. 時間相減

  4. 轉(zhuǎn)換格式

示例:

import datetime

startTime = datetime.datetime.now()  #獲取開始時間

l = [0] * 10000000   #定義一千萬個為0的列表或者處理其他任務(wù)

endTime = datetime.datetime.now()  #獲取結(jié)束時間

time1 = endTime - startTime     #時間相減程剥,得到的是datetime.timedelta對象
#datetime.timedelta對象的'days', 'max', 'microseconds', 'min', 'resolution', 'seconds', 'total_seconds'這些屬性是可以調(diào)用的
print(time1)   

print(str(time1 .seconds) + "." + str(time1 .microseconds//1000)  + "s")  #輸出時間差以秒為單位

在示例中定義了一千萬個為0 的列表劝枣,執(zhí)行的結(jié)果如下(機器不同時間可能有差別):

0:00:00.064976
0.64s

通過這段代碼,我們就可以輸出執(zhí)行某段程序所消耗的時間了织鲸。

掌握了如何輸出時間差舔腾,我們就可以查看選擇排序的執(zhí)行效率了。

完整代碼:

import random
import datetime

def sort(arr):
    for j in range(len(arr)-1):    
        minIndex = j
        for i in range(j+1,len(arr),1):
            if(arr[i] < arr[minIndex]):
                minIndex = i
        arr[j],arr[minIndex] = arr[minIndex],arr[j]

def main():
    arr = getRandomArr(1000)
    startTime = datetime.datetime.now()
    sort(arr)
    endTime = datetime.datetime.now()
    #print(isSorted(arr))
    expenseTime = endTime - startTime
    print(str(expenseTime.seconds) + "." + str(expenseTime.microseconds//1000)  + "s")

def getRandomArr(num):
    arr = []
    for i in range(num):
        arr.append(random.randint(0,num))
    return arr

def isSorted(arr):
    for i in range(len(arr)-1):
        if arr[i] > arr[i+1]:
            return False
    return True


if __name__ == "__main__":
    main()
    pass
使用matplotlib生成選擇排序執(zhí)行效率折線圖

直接輸出數(shù)值的方式還是不直觀搂擦,咱們使用圖表的方式展示選擇排序算法效率的折線圖稳诚。


import random
import datetime
import matplotlib.pyplot as plt

def sort(arr):
    for j in range(len(arr)-1):    
        minIndex = j
        for i in range(j+1,len(arr),1):
            if(arr[i] < arr[minIndex]):
                minIndex = i
        arr[j],arr[minIndex] = arr[minIndex],arr[j]

def main():
    timeList = []
    #計算
    l = [10,100,1000,2000,3000,4000,5000,10000]
    for i in l:
        arr = getRandomArr(i)
        startTime = datetime.datetime.now()
        sort(arr)
        endTime = datetime.datetime.now()
        expenseTime = endTime - startTime
        expenseTime = float(str(expenseTime.seconds) + "." + str(expenseTime.microseconds//1000))
        timeList.append(expenseTime)
    #print(isSorted(arr))
    plt.plot(l,timeList)
    plt.show()

def getRandomArr(num):
    arr = []
    for i in range(num):
        arr.append(random.randint(0,num))
    return arr

def isSorted(arr):
    for i in range(len(arr)-1):
        if arr[i] > arr[i+1]:
            return False
    return True


if __name__ == "__main__":
    main()
    pass
Figure_1.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瀑踢,隨后出現(xiàn)的幾起案子扳还,更是在濱河造成了極大的恐慌,老刑警劉巖丘损,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件普办,死亡現(xiàn)場離奇詭異,居然都是意外死亡徘钥,警方通過查閱死者的電腦和手機衔蹲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呈础,“玉大人舆驶,你說我怎么就攤上這事《” “怎么了沙廉?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長臼节。 經(jīng)常有香客問我撬陵,道長,這世上最難降的妖魔是什么网缝? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任巨税,我火速辦了婚禮,結(jié)果婚禮上粉臊,老公的妹妹穿的比我還像新娘草添。我一直安慰自己,他們只是感情好扼仲,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布远寸。 她就那樣靜靜地躺著抄淑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驰后。 梳的紋絲不亂的頭發(fā)上肆资,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音倡怎,去河邊找鬼迅耘。 笑死贱枣,一個胖子當著我的面吹牛监署,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纽哥,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钠乏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了春塌?” 一聲冷哼從身側(cè)響起晓避,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎只壳,沒想到半個月后俏拱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡吼句,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年锅必,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惕艳。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡搞隐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出远搪,到底是詐尸還是另有隱情劣纲,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布谁鳍,位于F島的核電站癞季,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倘潜。R本人自食惡果不足惜绷柒,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窍荧。 院中可真熱鬧辉巡,春花似錦、人聲如沸蕊退。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至净蚤,卻和暖如春钥组,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背今瀑。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工程梦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橘荠。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓屿附,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哥童。 傳聞我的和親對象是個殘疾皇子挺份,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 選擇排序原理:每一趟從元素列表中選取一個最小的元素作為有序序列中第i個元素?意思就是:下標:--------- ...
    4ffde5305e8f閱讀 1,831評論 1 3
  • 寫一個python 選擇排序: range(start, end, step) 產(chǎn)生一個可以迭代的對象。
    流動碼文閱讀 226評論 0 0
  • 【姓名】劉樹寅 【崗位/職業(yè)】職業(yè)培訓(xùn)師 【經(jīng)歷】二十二年職業(yè)經(jīng)歷贮懈,十五年人力資源管理工作匀泊,十年內(nèi)訓(xùn)師與培訓(xùn)師經(jīng)驗...
    百舸爭流613閱讀 217評論 0 0
  • 生活flag 遠沒行動來的盡心如意 來吧,期待下次見面
    老四肆閱讀 134評論 0 0
  • 關(guān)于寫作朵你,最早的記憶可以追溯到小學(xué)三年級各聘。為了備戰(zhàn)作文競賽,我每天去學(xué)校圖書館借書抡医,交一篇命題作文給語文老師...
    Chen_Shao閱讀 939評論 0 1