1. 程式人生 > >2018-2019-20172321 《Java軟體結構與資料結構》第五週學習總結

2018-2019-20172321 《Java軟體結構與資料結構》第五週學習總結

2018-2019-20172321 《Java軟體結構與資料結構》第五週學習總結

教材學習內容總結

第9章 排序與查詢

9.1查詢

  • 查詢是這樣一個過程,即在某個專案組中尋找某一指定目標元素,或者確定該組中並不存在該目標元素。對其進行查詢的專案組有時也稱為查詢組。
  • 兩種常見的查詢方式:線性插找、二分查詢
  • 要儘可能高效的完成查詢,要最小化比較操作次數,通常,查詢池裡專案數目越多,為了尋找該目標而做出的比較操作次數就越多,因此,該查詢池中專案的樹目定義了該問題的大小。

  • 9.1.3線性查詢法
    • 如果該查詢池組織成了一個某型別的列表,那麼完成該查詢的一個簡單方式就是從該列表頭開始一次比較每一個值,直到找到該目標元素為止。
    • 示意圖

- 平均查詢長度: 1/2(n+i) 
- 時間複雜度: O(N)
  • 9.1.4二分查詢法
    • 二分查詢是從排序列表的中間開始查詢,而不是從一端或另一端開始。如果沒有在那個中間元素找到目標元素則繼續查詢。
    • 二分查詢將利用查詢池中的專案組是已排序的這一事實。
    • 示意圖

- 平均查詢長度: (n+1/n)*(log2(n+1))-1
- 時間複雜度: O(logN)
  • 查詢演算法的比較
    • 二分查詢的每次比較都會刪除一半的可行候選項
    • 二分查詢的複雜度是對數級的,這使得它對大型查詢池非常有效率

9.2排序

  • 排序是這樣一個過程,即基於某一標準,要麼以升序要麼以降序將某一組專案按照某個規定順序排列。
  • 順序排序:選擇排序、插入排序、氣泡排序
  • 對數排序:快速排序、歸併排序

  • 9.2.1選擇排序法
    • 選擇排序演算法通過反覆地將某一特定值放到它在列表中的最終已排序位置,從而完成對某一列值的排序。
    • 時間複雜度:O(n^2)
    • 示意圖

  • 9.2.2插入排序法
    • 插入排序演算法通過反覆的將某一特定值插入到該列表某個已排序的子集中來完成對列表值的排序。
    • 時間複雜度:O(n^2)
    • 示意圖

  • 9.2.3氣泡排序法
    • 氣泡排序演算法通過重複的比較相鄰元素且在必要時將他們互換,從而完成對某個列表的排序。
    • 時間複雜度:O(n^2)
    • 示意圖

  • 9.2.4快速排序法
    • 快速排序演算法通過將列表分割槽,然後對這兩個分割槽進行遞迴式排序,從而完成對整個列表的排序
    • 時間複雜度:O(nlgn)
    • 示意圖(快速排序(Quicksort)是對氣泡排序的一種改進。)

  • 9.2.5歸併排序法
    • 歸併排序演算法通過將列表遞迴式分為兩半直至每一字列表都含有一個元素,然後將這些字列表歸併到一個排序順序中,從而完成對列表的排序。
    • 時間複雜度:O(nlgn)
    • 示意圖

教材學習中的問題和解決過程

  • 問題1:選擇排序與插入排序的區別,課本中提及到兩個排序的概念:
    • 選擇排序演算法是反覆的將一個個具體的值放到它最終的有序位置,從而完成一組值得排序。
    • 插入排序演算法是反覆的將一個個具體的值插入到表的已有序的子表中,從而完成一組值得排序。
    • 這兩個的概念剛開始的時候看起來好像一樣,本來就有點迷,認真一想更迷了。
  • 問題1解決方案:在上課的時候聽王老師講解,王老師說選擇是在有序序列裡操作,後來仔細思考之後發現選擇排序排出來之後之前的序列是肯定不變,而插入序列就不是,他就是在原本的有序序列之中插入一個元素。所以這就是他們的差別。

  • 問題2:為什麼在查詢排序時都要實現Comparable這個介面?
  • 問題2解決方案:
    • 通過查詢API文件:此介面強行對實現它的每個類的物件進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。
    • 實現此介面的物件列表(和陣列)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實現此介面的物件可以用作有序對映中的鍵或有序集合中的元素,無需指定比較器。

程式碼除錯中的問題和解決過程

  • 問題1和解決方案:首先我將pp9.2的i設定為3,然後開始編寫,執行之後可以正確,但是我眉頭一皺發現有兩個地方並不簡單,首先按照我這樣的方法,如果把i改成其他的就會排序錯誤或者報錯

同時我還發現,如果按照我現在的思路,好像執行到後來和氣泡排序就沒有區別了,我再一看題,才發現是減少某個大於1的數

我這樣寫問題就很大了,最後我又加了一層迴圈

但是

最後我把 for (scan = 0; scan <= data.length - i; scan++) 的<+改成=才解決問題

程式碼託管

上週考試錯題總結

好像沒有錯題,嘿嘿嘿

結對及互評

  • 部落格中值得學習的或問題:
    • 優點:程式碼編寫時遇到的問題記錄非常詳細;對書本上的內容理解也到位;這周的部落格不僅交的早,質量是極高。
  • 本週結對學習情況

其他(感悟、思考等,可選)

學習進度條

程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積)
目標 5000行 30篇 400小時
第一週 0/0 1/1 8/8
第二週 671/671 1/2 17/25
第三週 345/1016 1/3 15/40
第四周 405/1421 2/5 23/63
第五週 1202/2623 1/5 20/83

參考資料