一、 Day2 總結
我的《算法刷題日記》知識星球,Day2 星球內的朋友們打卡非常積極,截止目前已經有 100多 位提交代碼打卡。下面是今天部分打卡的截圖:
之所以放上這些截圖,是幫助大家更加方便辨別我的這個星球是否對你真正有用。
下面總結下 Day2:選擇排序算法,以下主要參考:@川 順 頁
,@Leven
兩位球友的打卡總結。
1.1 算法步驟
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
重複第二步,直到所有元素均排序完畢。
1.2 這種性能差
有一部分球友提交了下面這個版本,此代碼中雖然也沒有太大問題,但是循環中只要找到小的就交換一次,增加了內存佔用。
實際應該爲在單次循環時不進行位置交換,而是單次循環後再進行位置交換
def select_fun(list1):
n = len(list1)
for i in range(n-1): # 開啓循環,只需要循環n-1次即可,
# 假設第i個值爲最小值,min_value = list1[i]
for j in range(i+1, n): # j 輸入i後面的數字
if list1[j] < list1[i]: # 如果發現後面存在比最小值檔還小的數
list1[i], list1[j] = list1[j], list1[i] # 交換順序
return list1
if __name__ == '__main__':
list2 = [3, 5, 6, 1, 2]
print(select_fun(list2))
"""
# 輸出結果
[1, 2, 3, 5, 6]
"""
1.3 這種性能良
大部分球友提交的代碼實現版本:
def select_fun(list1):
n = len(list1)
count = 0 # 統計更改次數
for i in range(n-1): # 開啓循環,只需要循環n-1次即可,
min_index = i
for j in range(i+1, n): # j 輸入i後面的數字
if list1[j] < list1[min_index]: # 如果發現後面存在比最小值檔還小的數
min_index = j # 這裏暫時不更改位置,等循環結束後再更改
if min_index != i: # 判斷當前的最小值是不是i所在位置
list1[i], list1[min_index] = list1[min_index], list1[i]
count += 1
print('交換次數', count)
return list1
if __name__ == '__main__':
list2 = [3, 5, 6, 1, 2]
print(select_fun(list2))
"""
# 輸出結果
交換次數 4
[1, 2, 3, 5, 6]
"""
1.4 性能更好的實現
@Leven
打卡代碼:同時找出最小值與最大值放在數列兩側,兩邊逐漸逼近,循環次數會減少一些。
二、 Day3 作業題
零基礎入門算法,首先需要搞清楚下面基本問題:
什麼是一個算法? 程序就等於算法嗎?
理解以上參考清華大學鄧俊輝老師的視頻:
https://next.xuetangx.com/learn/THU08091000384/THU08091000384/1516243/video/1387095
理解以上參考清華大學鄧俊輝老師的課程。歡迎 Day3 打卡到知識星球,今日不需要編寫代碼。
長按二維碼,瞭解這個星球
前1000名,有31元優惠哦