02選擇排序

from base import gen_random_list

#選擇排序
'''
核心思想:
    假設(shè)無序數(shù)組長度為N,總共要遍歷N-1趟
    第一趟:遍歷第一個數(shù)據(jù)以及其往后的每個元素,找出最小的數(shù),遍歷完后,將第一個位置與這趟遍歷找到的最小的那個數(shù)交換位置
    第二趟:遍歷第二個數(shù)據(jù)以及其往后的每個元素敏簿,找出最小的數(shù),遍歷完后,將第二個位置與這趟遍歷找到的最小的那個數(shù)交換位置
    第三趟:遍歷第三個數(shù)據(jù)以及其往后的每個元素乘寒,找出最小的數(shù),遍歷完后,將第三個位置與這趟遍歷找到的最小的那個數(shù)交換位置
    ....
    第N-2趟:遍歷第N-2個數(shù)據(jù)以及其往后的每個元素,找出最小的數(shù),遍歷完后驹马,將第N-2個位置與這趟遍歷找到的最小的那個數(shù)交換位置
    第N-1趟:遍歷第N-1個數(shù)據(jù)以及其往后的每個元素牲蜀,找出最小的數(shù),遍歷完后笆制,將第N-1個位置與這趟遍歷找到的最小的那個數(shù)交換位置
'''

#選擇排序的雛形
#我們在這里建立一個對于5個元素構(gòu)成的隨機數(shù)組的排序
def select_sort_list_5():
    li=gen_random_list(5)
    print('original li:{}'.format(li))

    len_li=len(li)

    min_index=0
    for i in range(0,len_li):  # i in [0,1,2,3,4]
        if li[min_index]>li[i]:
            min_index=i
    li[min_index],li[0]=li[0],li[min_index]
    #完成這輪循環(huán)我們將第一個數(shù)據(jù)以及其往后的每個元素中的最小的那個數(shù)與第一個位置的元素交換位置

    min_index=1
    for i in range(1,len_li): # i in [1,2,3,4]
        if li[min_index]>li[i]:
            min_index=i
    li[min_index],li[1]=li[1],li[min_index]
    #完成這輪循環(huán)我們將第二個數(shù)據(jù)以及其往后的每個元素中的最小的那個數(shù)與第二個位置的元素交換位置

    min_index=2
    for i in range(2,len_li): # i in [2,3,4]
        if li[min_index]>li[i]:
            min_index=i
    li[min_index],li[2]=li[2],li[min_index]
    #完成這輪循環(huán)我們將第三個數(shù)據(jù)以及其往后的每個元素中的最小的那個數(shù)與第三個位置的元素交換位置

    min_index=3
    for i in range(3,len_li): # i in [3,4]
        if li[min_index]>li[i]:
            min_index=i
    li[min_index],li[3]=li[3],li[min_index]
    #完成這輪循環(huán)我們將第四個數(shù)據(jù)以及其往后的每個元素中的最小的那個數(shù)與第四個位置的元素交換位置

    print('sorted li:{}'.format(li))
'''
例如:
    select_sort_list_5()
輸出為:
    original li:[95, 89, 29, 50, 28]
    sorted li:[28, 29, 50, 89, 95] 
'''


'''
我們來推廣一下
下面我們來看選擇范圍的變化
'''
def select_sort_list_range(li):
    len_li=len(li)
    #當(dāng)傳入列表的長度為0或者1的時候,直接返回
    if len_li in (0,1):
        return li
    for i in range(0,len_li-1):
        print([_ for _ in range(i,len_li)],'再此過程中,獲取出這個范圍中的最小值涣达,并將它與位置為',i+1,'索引為',i,'元素交換位置,完成這次后',[_ for _ in range(0,i+1)],'是有序的')
'''
例如:
    select_sort_list_range(gen_random_list(10))
輸出為:
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 再此過程中,獲取出這個范圍中的最小值在辆,并將它與位置為 1 索引為 0 元素交換位置,完成這次后 [0] 是有序的
    [1, 2, 3, 4, 5, 6, 7, 8, 9] 再此過程中,獲取出這個范圍中的最小值,并將它與位置為 2 索引為 1 元素交換位置,完成這次后 [0, 1] 是有序的
    [2, 3, 4, 5, 6, 7, 8, 9] 再此過程中,獲取出這個范圍中的最小值度苔,并將它與位置為 3 索引為 2 元素交換位置,完成這次后 [0, 1, 2] 是有序的
    [3, 4, 5, 6, 7, 8, 9] 再此過程中,獲取出這個范圍中的最小值匆篓,并將它與位置為 4 索引為 3 元素交換位置,完成這次后 [0, 1, 2, 3] 是有序的
    [4, 5, 6, 7, 8, 9] 再此過程中,獲取出這個范圍中的最小值,并將它與位置為 5 索引為 4 元素交換位置,完成這次后 [0, 1, 2, 3, 4] 是有序的
    [5, 6, 7, 8, 9] 再此過程中,獲取出這個范圍中的最小值寇窑,并將它與位置為 6 索引為 5 元素交換位置,完成這次后 [0, 1, 2, 3, 4, 5] 是有序的
    [6, 7, 8, 9] 再此過程中,獲取出這個范圍中的最小值鸦概,并將它與位置為 7 索引為 6 元素交換位置,完成這次后 [0, 1, 2, 3, 4, 5, 6] 是有序的
    [7, 8, 9] 再此過程中,獲取出這個范圍中的最小值,并將它與位置為 8 索引為 7 元素交換位置,完成這次后 [0, 1, 2, 3, 4, 5, 6, 7] 是有序的
    [8, 9] 再此過程中,獲取出這個范圍中的最小值疗认,并將它與位置為 9 索引為 8 元素交換位置,完成這次后 [0, 1, 2, 3, 4, 5, 6, 7, 8] 是有序的
        
'''

'''
到這一步我們結(jié)合上面的分析完残,來寫個選擇吧
'''
def select_sort_list(li):
    len_li=len(li)
    #當(dāng)傳入列表的長度為0或者1的時候伏钠,直接返回
    if len_li in (0,1):
        return li
    for i in range(0,len_li-1):
        min_index=i
        for j in range(i,len_li):
            if li[min_index]>li[j]:
                min_index=j
        li[min_index],li[i]=li[i],li[min_index]
    return li
'''
例如:
    original_list=gen_random_list(20)
    print('Original List:{}'.format(original_list))
    result_list=select_sort_list(original_list)
    print('Sorted List:{}'.format(result_list))

輸出:
    Original List:[100, 86, 58, 94, 79, 28, 45, 22, 31, 86, 64, 97, 97, 16, 64, 56, 72, 38, 61, 22]
    Sorted List:[16, 22, 22, 28, 31, 38, 45, 56, 58, 61, 64, 64, 72, 79, 86, 86, 94, 97, 97, 100]
'''

'''
還是和上次一樣,寫一個尾遞歸的版本看看
'''
def select_sort_list_recursive(li,i=0):
    len_li=len(li)
    if len_li in (0,1):
        return li

    if i==len_li:
        return li
    min_index=i
    for j in range(i,len_li):
        if li[min_index]>li[j]:
            min_index=j
    li[min_index],li[i]=li[i],li[min_index]
    return select_sort_list_recursive(li,i+1)
'''
例如:
    original_list=gen_random_list(20)
    print('Original List:{}'.format(original_list))
    result_list=select_sort_list_recursive(original_list)
    print('Sorted List:{}'.format(result_list))
輸出:
    Original List:[27, 41, 47, 89, 100, 19, 77, 77, 100, 17, 68, 15, 38, 98, 19, 45, 42, 70, 31, 75]
    Sorted List:[15, 17, 19, 19, 27, 31, 38, 41, 42, 45, 47, 68, 70, 75, 77, 77, 89, 98, 100, 100]
'''
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谨设,一起剝皮案震驚了整個濱河市熟掂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扎拣,老刑警劉巖赴肚,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異二蓝,居然都是意外死亡誉券,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門刊愚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踊跟,“玉大人,你說我怎么就攤上這事鸥诽∩堂担” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵牡借,是天一觀的道長拳昌。 經(jīng)常有香客問我,道長钠龙,這世上最難降的妖魔是什么炬藤? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮碴里,結(jié)果婚禮上沈矿,老公的妹妹穿的比我還像新娘。我一直安慰自己并闲,他們只是感情好细睡,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帝火,像睡著了一般溜徙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上犀填,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天蠢壹,我揣著相機與錄音,去河邊找鬼九巡。 笑死图贸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疏日,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼偿洁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沟优?” 一聲冷哼從身側(cè)響起涕滋,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挠阁,沒想到半個月后宾肺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡侵俗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年锨用,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘谣。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡增拥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洪橘,到底是詐尸還是另有隱情跪者,我是刑警寧澤棵帽,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布熄求,位于F島的核電站,受9級特大地震影響逗概,放射性物質(zhì)發(fā)生泄漏弟晚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一逾苫、第九天 我趴在偏房一處隱蔽的房頂上張望卿城。 院中可真熱鬧,春花似錦铅搓、人聲如沸瑟押。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽多望。三九已至,卻和暖如春氢烘,著一層夾襖步出監(jiān)牢的瞬間怀偷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工播玖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椎工,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像维蒙,于是被迫代替她去往敵國和親掰吕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349