20172304 《程序設計與數據結構》第五週學習總結

20172304 《程序設計與數據結構》第五週學習總結

教材學習內容總結

本博客圖片純屬網絡資源如有雷同純屬巧合。
來源:百度圖片。
本章主要對查找和排序的相關問題進行了講解。並介紹了幾種較爲常用的查找和排序方法。
查找:從某個項目組中尋找指定目標元素,或者確定該組中並不存在該目標元素。
查找池:對其查找的項目組。
從算法的角度來說,我們希望最小化比較操作的次數。
9.1.1靜態方法
靜態方法又稱類方法,可以通過類名來激活。可以不必使用實例化來調用方法。聲明方法時使用static修飾符就可以將方法聲明爲靜態的。
泛型方法要創建泛型方法,只需在方法頭的返回類型前插入一個泛型聲明就可以了。例如

public static <T extends Comparable<T> boolean>
      linearSearch (T[] data, int min, int max, T target)

9.1.3線性查找法
線性查找: 從該列表頭開始一次比較每一個值,知道找到該目標元素。
線性查找示意圖

9.1.4 二分查找法
二分查找是從排序列表的中間開始查找,如果沒有在那個中間元素找到目標元素,則繼續查找。通過比較削減一般的查找池,剩下的一半查找池將表示爲可行候選項,以相同方式繼續查找,每一次比較都會將可行候選向削減一半,直至最終找到目標元素,或者不再存在可行候選項。
二分查找示意圖

9.2 排序
排序:基於某一標準,要麼一聖墟要麼已將徐將某一組項目按照某個規定順序排列。
基於效率排序算法通常也分爲兩類:
順序排序:他通常使用一對嵌套循環對n個元素排序,需要大約n²次比較;以及對數排序,它對n個元素進行排序通常需要大約nlog₂n次比較。
9.1.2 選擇排序法
選擇排序算法的一般策略如下:掃描整個列表以找到最小值。將這個值與該列表第一個位置處的值交換。掃描(除了第一個值的)剩餘部分列表並找出最小值,然後將它和該列表第二個位置處的值進行交換。掃描(除了前兩個值的)剩餘部分列表並找出最小值,然後將它和該列表第三個位置處的值交換。對列表中每一個位置繼續該過程。當這一過程結束後,列表也就已經排好序了。
選擇排序示意圖

9.2.2 插入排序法
對列表的頭兩個值依據其相對大小對其及逆行排序,如果有必要則將它們互換。將列表的第三個值插入到頭兩個(已排序的)值中的恰當位置。然後將第四個值插入到列表頭三個值中的正確位置。每做出一次插入,該排序子集中的值數目就會增加一個。繼續這一過程,直至列表中的所有元素都得到完全排序。
插入排序示意圖:

9.2.3 冒泡排序法
掃描該隊列且比較鄰接元素,如果它們不是按相對順序排列則將其互換。這就像把最大值“冒泡”到列表的最後位置,這是它在最終已排序列表中的恰當位置。然後再次掃描該列表,冒泡出倒數第二個值。繼續這一過程,直至所有元素都被冒泡到它們正確的位置。
冒泡排序示意圖:

9.2.4 快速排序法
首先選擇一個列表元素作爲分區元素。下一步,分割該列表,時的小於該分區元素的所有元素位於該元素的左邊,所有大於該分區元素的元素位於有表。最後,將該快速排序策略(遞歸式)應用於兩個分區。
快速排序法示意圖:

9.2.5 歸併排序法
首先將列表分爲兩個大約相等的部分,然後對每一個部分列表遞歸調用其自身。繼續該列表的遞歸分解,直至達到該遞歸的基本情形,這是該列表被分割成長度爲1的列表。
歸併排序法示意圖:


9.3 基數排序法
基數排序的大致思路有點像投桶,就是將先按照個位蒐集數據然後在按照十位數蒐集數據以此類推最終按順序輸出。

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

問題:各種排序的應用場景
問題解決方案:
冒泡排序
冒泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說排序完成。規模比較小的時候應用冒泡排序,主要應用於教學。。。
選擇排序--只會移動N次
 選擇排序的主要思想:首先找到數組中最小的那個元素,其次,將它和第一個元素交換。接下來找第二小和第二個交換。運行時間和輸入無關,數據移動最少。當數據量較小的時候適用。
插入排序
時間複雜度爲O(n^2),數據量小時使用。並且大部分已經被排序。
快速排序
 快速排序是最快的通用排序算法,在大多數實際情況中,快速排序是最佳選擇。在java的默認排序中是使用的是三向切分排序。
歸併排序
如果需要穩定,空間不是很重要,請選擇歸併。
O(n)時間複雜度的基數排序 
當範圍已經知道,而且空間不是很重要的情況下使用基數排序。
---------------------
作者:li563868273
來源:CSDN
原文:https://blog.csdn.net/li563868273/article/details/51200876
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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

  • 問題1:在完成課後作業pp9.2,即在書上冒泡排序的代碼的基礎上進行編寫間隔排序時,發現有一個元素不能正常的進行排序。問題如圖。

    很明顯在運行結果的界面中可以觀察到20172304這個元素並沒有正常的進行排序。
  • 問題1解決方案:後來我查看了改寫後的方法,然後認爲是循環條件使循環少進行了。


    於是我將第一張圖片的最後一行代碼中的position>1改爲了position大於0;然後進行了運行結果如圖所示是正常的。
  • 問題2:在進行統計各種排序方法的比較次數與運行時間時,我是直接實例化一個Integer型數組,然後通過不同的Integer變量對實例化的數組進行引用,然後在進行排序。但是我發現插入排序的比較次數與選擇排序的比較次數相比明顯很小。
  • 問題2解決方案:我將main函數中的對其他排序方法的調用都註釋掉了,然後對整個main函數進行了單步調試,發現最後得到的比較次數是28次,這時,我想到會不會是引用變量的改變引起了被引用對象的改變、於是我就先聲明瞭若干個Integer對象,然後在逐個進行實例化,最後在進行調用,發現這樣就沒有問題。

  • 問題3:在進行歸併排序和快速排序的統計中我遇見了問題,因爲這兩個方法是通過遞歸實現的。
  • 問題3解決方案:
    我寫了幾個方法進行統計

    代碼託管

上週考試錯題總結

  • 錯題1:
  • 錯題一解析:這道題說的是接口不可以派生接口,這是錯的,我應該是看錯了所以才選的true。

    博客互評

    20172304郭愷同學本次的博客十分優秀,對教材的總結詳略得當,而又針對自己在教材中發現的問題進行了深入的鞭辟入裏的思考與解答。整個過程看起來賞心悅目給人一種美的享受。
    20172328李馨雨同學的博客十分的完整與豐富,體現了她認真的學習態度。

點評過的同學博客和代碼

  • 上週博客互評情況
    20172301 郭愷同學本次博客十分簡潔,對教材的內容概括的十分精煉,總體篇幅較短。
    20172328 李馨雨同學這次的博客中規中矩,沒有特別出彩的地方,但是結構完整。

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

    本週又經過了充分的學習與思考,整合與聯繫。又不斷地充實了自己,希望在老師的引領下,能學到更多更好的有用的知識。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 30/30 1/1 10/10
第二週 766/796 1/2 40/50
第三週 817/1613 1/3 20/70
第四周 1370/3983 2/5 30/100
第五週 1235/5214 1/6 10/110

參考資料

1.藍墨雲班課
2.java軟件結構與數據結構
3.java如何計算運行程序時間
4.各種排序的應用場景

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