#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]
----------------------------------------------------------------------------------------------------
'''
01排序算法之冒泡
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門偿枕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人户辫,你說我怎么就攤上這事渐夸。” “怎么了渔欢?”我有些...
- 文/不壞的土叔 我叫張陵墓塌,是天一觀的道長。 經(jīng)常有香客問我,道長苫幢,這世上最難降的妖魔是什么访诱? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮韩肝,結(jié)果婚禮上触菜,老公的妹妹穿的比我還像新娘。我一直安慰自己哀峻,他們只是感情好涡相,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剩蟀,像睡著了一般催蝗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上育特,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涮拗!你這毒婦竟也來了乾戏?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布象踊,位于F島的核電站温亲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杯矩。R本人自食惡果不足惜栈虚,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菊碟。 院中可真熱鬧节芥,春花似錦、人聲如沸逆害。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽魄幕。三九已至,卻和暖如春颖杏,著一層夾襖步出監(jiān)牢的瞬間纯陨,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 最近在學(xué)習(xí)算法累颂,對此也做一個總結(jié): 排序?qū)τ谌魏我粋€程序員來說,可能都不會陌生凛俱。你學(xué)的第一個算法紊馏,可能就是排序。大...
- 冒泡排序是八大排序算法之一最冰。其排序原理是每次都對相鄰的兩個數(shù)進(jìn)行比較瘦棋,如果前面一個數(shù)大于后面一個數(shù),那就交換兩個數(shù)...
- 問題:假設(shè)對含有n個元素的數(shù)組進(jìn)行冒泡排序(從小到大)。 冒泡排序: 比較排序: 選擇排序 以上三種排序是極度相似...
- 插入排序和冒泡排序都比較簡單团甲,但是時間復(fù)雜度有點高逾冬。 首先是冒泡排序,是通過相鄰的兩個數(shù)字進(jìn)行比較躺苦,每一趟之后身腻,待...