爆料算法刷題日記 Day1;佈置 Day2 算法題

大家晚上好,錯過昨天的算法刷題作業帖的朋友,可點擊下面查看:

算法刷題起航,幫你走向下一個巔峯!

第一道題目前星球內提交作業 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:

  1. 整體無序

print(bubble_sort([3,5,1,3,8,7,9,4,5]))
  1. 局部無序

print(bubble_sort([1,2,3,5,4,6,7,8,9]))
  1. 完全有序

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 開始系統學習算法知識,從什麼是一個算法開始。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章