2018-2019-20172321 《Java軟件結構與數據結構》第五週學習總結

2018-2019-20172321 《Java軟件結構與數據結構》第五週學習總結

教材學習內容總結

第9章 排序與查找

9.1查找

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

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

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

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

9.2排序

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

  • 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解決方案:在上課的時候聽王老師講解,王老師說選擇是在有序序列裏操做,後來仔細思考以後發現選擇排序排出來以後以前的序列是確定不變,而插入序列就不是,他就是在本來的有序序列之中插入一個元素。因此這就是他們的差異。git

  • 問題2:爲何在查找排序時都要實現Comparable這個接口?
  • 問題2解決方案:
    • 經過查找API文檔:此接口強行對實現它的每一個類的對象進行總體排序。這種排序被稱爲類的天然排序,類的 compareTo 方法被稱爲它的天然比較方法。
    • 實現此接口的對象列表(和數組)能夠經過 Collections.sort(和 Arrays.sort)進行自動排序。實現此接口的對象能夠用做有序映射中的鍵或有序集合中的元素,無需指定比較器。

代碼調試中的問題和解決過程

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

同時我還發現,若是按照我如今的思路,好像運行到後來和冒泡排序就沒有區別了,我再一看題,才發現是減小某個大於1的數算法

我這樣寫問題就很大了,最後我又加了一層循環數組

可是數據結構

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

代碼託管

上週考試錯題總結

好像沒有錯題,嘿嘿嘿ui

結對及互評

  • 博客中值得學習的或問題:
    • 優勢:代碼編寫時遇到的問題記錄很是詳細;對書本上的內容理解也到位;這周的博客不只交的早,質量是極高。
  • 本週結對學習狀況

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

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 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

參考資料

相關文章
相關標籤/搜索