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

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

教材學習內容總結

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

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

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

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

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

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

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

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

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


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

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

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

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

  • 問題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.各類排序的應用場景

相關文章
相關標籤/搜索