大家晚上好,錯過昨天的算法刷題作業帖的朋友,可點擊下面查看:
第一道題目前星球內提交作業 90 多人次:作業榜第一名上午時被點贊就11次,總結算法的兩個優化點,代碼也很簡潔,確實值得贊:
提交作業的代碼有人使用Python,有c/c++ ,有java,有 Lua,還有 js.
下面,在這裏與大家分享下作業點贊第一名 Leven 總結的冒泡排序的兩個優化點:
對應的 Python 實現代碼:
剛剛我重新整理一版,完全參考球友 Leven 的實現思路:
def bubble_sort(our_list):
lastSwapIndex, sortBoundary = 0, len(our_list) - 1
for _ in range(len(our_list)):
flag = True # 標記數組是否有序
for j in range(0, sortBoundary):
if our_list[j] > our_list[j+1]:
our_list[j], our_list[j+1] = our_list[j +1], our_list[j] # swap elements
flag = False
lastSwapIndex = j # 標記最後一次交換位置
sortBoundary = lastSwapIndex # 比較一輪後,得到下一輪排序的邊界
if flag:
break
return our_list
考慮下面三種輸入的待排序序列 our_list:
整體無序
print(bubble_sort([3,5,1,3,8,7,9,4,5]))
局部無序
print(bubble_sort([1,2,3,5,4,6,7,8,9]))
完全有序
print(bubble_sort([1,2,3,4,5,6,7,8,9]))
更多星球中其他人的提交,也能很方便的看到,就像一個班級的朋友圈,非常有營養。
並且,學習別人寫的代碼,也能從中發現一些問題。比如球友小六首先在羣裏提出來,有的代碼把冒泡排序寫成選擇排序了,並且好多都出現這個問題。所以在此統一吆喝一聲,大家看看有沒有類似的錯誤。
區別:冒泡排序比較的一定是緊緊相鄰的兩個元素;而選擇排序卻不是每次比較緊鄰的兩個元素,而下面的代碼就不是每次比較緊鄰的兩個元素,正是選擇排序的基本實現。
如果還是沒有很好的理解,我放上兩張例子圖:
下面是冒泡排序的例子:
下面是選擇排序的例子:
你看一個不起眼的冒泡排序算法,如果細細品味起來也是很有意思的,雖然它的性能註定不好,但是我們的目的是爲了訓練算法思維,提升算法的分析和應用能力。從這個角度而言,我們的目的達到了。我相信堅持這樣分析下去,一定可以讓大家的算法思維能力變得更好。
歡迎提交你的答案到知識星球裏,並完成每日打卡。打卡累積 300 天,無論你多少錢加入的星球,我們都會退還除平臺外收取的所有費用,相當於免費學習
長按二維碼,查看算法日記
Day 2 算法題:寫出選擇排序
參考下面的幾幅圖,紅色表示當前找到的未排序序列中的最小值,綠色表示當前被比較的元素:
又找到一個更小的值2,重新標記它爲紅色:
一輪比較後,找到最小值2並標記爲黃色,表示就位,繼續在未排序序列中尋找最小值:
def selection_sort(our_list):
# 補全代碼
#
#
return our_sorted_list
參考本文對選擇排序的一些提示,在星球內記錄代碼及思考過程。
通過這兩道基本的算法練習題,找到一些做算法題的感覺。明天Day3 開始系統學習算法知識,從什麼是一個算法開始。