01排序算法之冒泡

#gen_random_list(num) 其中num為生成隨機數(shù)的個數(shù)
#check_li_sorted(li,desc=False) 判斷元素是否有序(默認(rèn)從小到大,desc決定時候按照反序來檢測)
from base import check_li_sorted,gen_random_list

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

    len_li=len(li)

    for i in range(0,len_li-1): # i in [0,1,2,3]
        if li[i]>li[i+1]:
            li[i],li[i+1]=li[i+1],li[i]
    #完成這輪循環(huán)后這5個隨機數(shù)中最大值的位置肯定位于第5個位置(索引為4的位置)

    for i in range(0,len_li-2): # i in [0,1,2]
        if li[i]>li[i+1]:
            li[i],li[i+1]=li[i+1],li[i]
    #完成這輪循環(huán)前4個隨機數(shù)中最大值的位置肯定位于第4個位置(索引為3的位置)

    for i in range(0,len_li-2): # i in [0,1]
        if li[i]>li[i+1]:
            li[i],li[i+1]=li[i+1],li[i]
    #完成這輪循環(huán)前3個隨機數(shù)中最大值的位置肯定位于第4個位置(索引為2的位置)

    for i in range(0,len_li-1): # i in [0]
        if li[i]>li[i+1]:
            li[i],li[i+1]=li[i+1],li[i]
    #完成這輪循環(huán)前2個隨機數(shù)中最大值的位置肯定位于第4個位置(索引為1的位置)
    #剩下來的那個元素肯定是最小的元素爬凑,位于第1個位置(索引為0)


    print("sorted li:{}".format(li))
'''
例如:
    buble_sort_list_5()
輸出為:
    original li:[99, 12, 21, 80, 90]
    sorted li:[12, 21, 80, 90, 99]
'''


'''
接下來我們推廣一下
下面我們來看下冒泡過程
'''
def bubble_sort_list_range(li):
    len_li=len(li)
    #當(dāng)傳入列表的長度為0或者1的時候萎馅,直接返回
    if len_li in (0,1):
        return li
    for i in range(len_li,1,-1):
        print([_ for _ in range(i-1)]," 在此過程中,我們通過比較交換相鄰元素將最大值移到位置",i,"索引為",i-1,"其中",[_ for _ in range(i-1,len_li)],'為有序的')
'''
例如:
    bubble_sort_list_range(gen_random_list(10))   
輸出為:
    [0, 1, 2, 3, 4, 5, 6, 7, 8]  在此過程中祠够,我們通過比較交換相鄰元素將最大值移到位置 10 索引為 9 其中 [9] 為有序的
    [0, 1, 2, 3, 4, 5, 6, 7]  在此過程中场航,我們通過比較交換相鄰元素將最大值移到位置 9 索引為 8 其中 [8, 9] 為有序的
    [0, 1, 2, 3, 4, 5, 6]  在此過程中疑枯,我們通過比較交換相鄰元素將最大值移到位置 8 索引為 7 其中 [7, 8, 9] 為有序的
    [0, 1, 2, 3, 4, 5]  在此過程中寥掐,我們通過比較交換相鄰元素將最大值移到位置 7 索引為 6 其中 [6, 7, 8, 9] 為有序的
    [0, 1, 2, 3, 4]  在此過程中您旁,我們通過比較交換相鄰元素將最大值移到位置 6 索引為 5 其中 [5, 6, 7, 8, 9] 為有序的
    [0, 1, 2, 3]  在此過程中烙常,我們通過比較交換相鄰元素將最大值移到位置 5 索引為 4 其中 [4, 5, 6, 7, 8, 9] 為有序的
    [0, 1, 2]  在此過程中,我們通過比較交換相鄰元素將最大值移到位置 4 索引為 3 其中 [3, 4, 5, 6, 7, 8, 9] 為有序的
    [0, 1]  在此過程中鹤盒,我們通過比較交換相鄰元素將最大值移到位置 3 索引為 2 其中 [2, 3, 4, 5, 6, 7, 8, 9] 為有序的
    [0]  在此過程中蚕脏,我們通過比較交換相鄰元素將最大值移到位置 2 索引為 1 其中 [1, 2, 3, 4, 5, 6, 7, 8, 9] 為有序的
'''

'''
到這一步我們結(jié)合上面的分析,來寫個冒泡吧
'''
def bubble_sort_list(li):
    len_li=len(li)
    #當(dāng)傳入列表的長度為0或者1的時候侦锯,直接返回
    if len_li in (0,1):
        return li
    for i in range(len_li,1,-1):
        #為了將當(dāng)前無序范圍中的最大值放到指定的位置
        for j in range(i-1):
            if li[j]>li[j+1]:
                li[j],li[j+1]=li[j+1],li[j]
    return li
'''
例如:
    original_list=gen_random_list(20)
    print('Original List:{}'.format(original_list))
    result_list=bubble_sort_list(original_list)
    print("Sorted List:{}".format(result_list))
    
輸出:
    Original List:[72, 59, 37, 81, 81, 47, 74, 65, 40, 63, 43, 60, 99, 43, 67, 38, 86, 42, 51, 92]
    Sorted List:[37, 38, 40, 42, 43, 43, 47, 51, 59, 60, 63, 65, 67, 72, 74, 81, 81, 86, 92, 99] 
'''

'''
接下來我們皮一把驼鞭,改成尾遞歸的形式
'''
def bubble_sort_list_recursive(list,i):
    #當(dāng)傳入列表的長度為0或者1的時候,直接返回
    if len(list) in (0,1):
        return list

    if i==0:
        return list
    for j in range(i-1):
        if list[j]>list[j+1]:
            list[j],list[j+1]=list[j+1],list[j]

    return bubble_sort_list_recursive(list,i-1)
'''
例如:
    original_list=gen_random_list(20)
    print('Original List:{}'.format(original_list))
    result_list=bubble_sort_list_recursive(original_list,len(original_list))
    print("Sorted List:{}".format(result_list))

    print('-'*100) 
輸出:
    Original List:[45, 91, 72, 20, 95, 19, 75, 85, 44, 79, 16, 86, 80, 90, 38, 54, 40, 92, 75, 81]
    Sorted List:[16, 19, 20, 38, 40, 44, 45, 54, 72, 75, 75, 79, 80, 81, 85, 86, 90, 91, 92, 95]
    ----------------------------------------------------------------------------------------------------
'''

'''
為了避免每次使用的時候都用傻逼的len(list),我們這里用個裝飾器
'''
import functools
def wrap(func):
    @functools.wraps(func)
    def inner(*args):
        return func(args[0],len(args[0]))
    return inner
#升級版尺碰,利用裝飾器
@wrap
def bubble_sort_list_recursive_upper(list,i):
    if i==0:
        return list
    for j in range(i-1):
        if list[j]>list[j+1]:
            list[j],list[j+1]=list[j+1],list[j]

    return bubble_sort_list_recursive(list,i-1)
'''
例如:
    original_list=gen_random_list(20)
    print('Original List:{}'.format(original_list))
    result_list=bubble_sort_list_recursive_upper(original_list,len(original_list))
    print("Sorted List:{}".format(result_list))

    print('-'*100)
輸出:
    Original List:[29, 47, 81, 34, 94, 92, 28, 32, 45, 91, 61, 24, 68, 65, 83, 62, 82, 79, 86, 27]
    Sorted List:[24, 27, 28, 29, 32, 34, 45, 47, 61, 62, 65, 68, 79, 81, 82, 83, 86, 91, 92, 94]
    ----------------------------------------------------------------------------------------------------  
'''
?著作權(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
  • 文/潘曉璐 我一進(jìn)店門偿枕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人户辫,你說我怎么就攤上這事渐夸。” “怎么了渔欢?”我有些...
    開封第一講書人閱讀 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

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