2018年學習總結博客總目錄:第一週 第二週 第三週 第四周 第五週
html
查找即在某項目組中尋找某一指定目標元素,或肯定該組中並不存在此元素。對其進行查找的項目組稱爲查找池。java
1.線性查找法,即從列表頭開始依次比較每個值,直至找到該目標元素或到列表尾未找到,這是一種最簡單的查找方式,但它的效率並非高效的。
2.二分查找法一種在有序數組中查找某一特定元素的搜索算法。搜素過程從數組的中間元素開始,若是中間元素正好是要查找的元素,則搜索過程結束;若是某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,並且跟開始同樣從中間元素開始比較。若是在某一步驟數組爲空,則表明找不到。這種搜索算法每一次比較都使搜索範圍縮小一半。折半搜索每次把搜索區域減小一半,時間複雜度爲Ο(logn)。
3.兩種查找方法對比:線性查找要比二分查找簡單,易於調試;同時,線性查找無需花費額外成本排序該列表。對於小型問題,這兩種算法幾乎不存在實用差異,但n變大後,二分查找就會變得頗有效率。c++
排序:基於某一標準,按照某個規定順序對某一項目組進行順序排列。基於效率排序算法可分爲兩類:順序排序(須要進行n²次比較);對數排序(須要進行nlog(2)n次比較)。git
1.選擇排序法:在長度爲N的無序數組中,第一次遍歷n-1個數,找到最小的數值與第一個元素交換;
第二次遍歷n-2個數,找到最小的數值與第二個元素交換;
......
第n-1次遍歷,找到最小的數值與第n-1個元素交換,排序完成。程序員
2.插入排序法:在要排序的一組數中,假定前n-1個數已經排好序,如今將第n個數插到前面的有序數列中,使得這n個數也是排好順序的。如此反覆循環,直到所有排好順序。
算法
3.冒泡排序法:比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對全部的元素重複以上的步驟,除了最後一個。
持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。
實現代碼:編程
public static <T extends Comparable<T>> void bubbleSort(T[] data) { int position, scan; T temp; for (position = data.length - 1; position >= 0; position--) { for (scan = 0; scan <= position - 1; scan++) { if (data[scan].compareTo(data[scan+1]) > 0) swap(data, scan, scan + 1); } } }
4.快速排序法:先從數列中取出一個數做爲key值;
將比這個數小的數所有放在它的左邊,大於或等於它的數所有放在它的右邊;
對左右兩個小數列重複第二步,直至各區間只有1個數。
數組
5.歸併排序法:申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列
設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置
比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置
重複步驟3直到某一指針達到序列尾
將另外一序列剩下的全部元素直接複製到合併序列尾
函數
6.基數排序法:將全部待比較數值(正整數)統一爲一樣的數位長度,數位較短的數前面補零. 而後, 從最低位開始, 依次進行一次排序.這樣從最低位排序一直到最高位排序完成之後, 數列就變成一個有序序列.
學習
問題1:「@SuppressWarnings("unchecked")」是有什麼做用?
問題1解決方案:java.lang.SuppressWarnings是J2SE5.0中標準的Annotation之一。能夠標註在類、字段、方法、參數、構造方法,以及局部變量上。
做用:告訴編譯器忽略指定的警告,不用在編譯完成後出現警告信息。
使用:
@SuppressWarnings(「」)
@SuppressWarnings({})
@SuppressWarnings(value={})
書上的這處使用是 @SuppressWarnings("unchecked"),告訴編譯器忽略 unchecked 警告信息,如使用List,ArrayList等未進行參數化產生的警告信息。
問題2:關於泛型方法使用及其形式。
public static <T extends CharSequence> T defaultIfBlank(T str, T defaultStr) { return isBlank(str) ? defaultStr : str; }
如上圖的泛型方法在方法名稱前面有一個
1)public 與 返回值中間<T>很是重要,能夠理解爲聲明此方法爲泛型方法。
2)只有聲明瞭<T>的方法纔是泛型方法,泛型類中的使用了泛型的成員方法並非泛型方法。
3)<T>代表該方法將使用泛型類型T,此時才能夠在方法中使用泛型類型T。
4)與泛型類的定義同樣,此處T能夠隨便寫爲任意標識,常見的如T、E、K、V等形式的參數經常使用於表示泛型。
問題1:關於PP9.2,讀了兩次題目,第一遍沒讀明白,第二遍讀不懂「將i減小某個大於1的數量i並繼續該過程直至i小於1」,而且在第一次作完後結果正確,但我感受作的不對。
while(i>=1){......i-=1}
,這樣作是能夠出結果,可是這其中有錯誤,當循環運行到i=1時,這不就是把冒泡排序又作了一遍,那這和間隔排序有什麼聯繫,後放棄了這種思路。public static <T extends Comparable<T>>void gapSort(T[] data,int i) { int scan; while (i>=1) { for (scan = 0;scan<=data.length-1-i;scan++) { if (data[scan].compareTo(data[scan + i]) > 0) swap(data, scan, scan + i); } i -=2; } }
隨後,用以前的SortPhoneList類作了測試,結果以下:
問題2:PP9.4,如何來查看代碼的運行時間?
long a=System.currentTimeMillis(); Sorting.quickSort2(list); System.out.println("舊版本執行耗時 : "+(System.currentTimeMillis()-a)/1000f+" 秒 "); long b=System.currentTimeMillis(); Sorting.quickSort2(list); System.out.println("新版本執行耗時 : "+(System.currentTimeMillis()-b)/1000f+" 秒 ");
運行結果見圖:
問題3:在記錄歸併、快速排序法的總比較次數時如何去計算遞歸函數的調用次數?
問題3解決方案:從網上找方法:
好比一個遞歸函數:
: double f (double n) {
: if(n <= 10.0)
: ...................
再封一層函數,傳個計數器進去
double f(double n, Integer c) {
f(n);
c++;
}
試過以後發現沒用,每次都會把這個c初始化,沒法進行統計。後繼續找,看到了這個,因而試着設置了一個全局變量,便可以記錄了。
定義一個全局變量,在遞歸函數裏+1,這樣遞歸的次數就放到全局變量裏了
public class $ { private static int count; public static void main(String... _) { test('A', 'B', 'C', 3); System.out.println("遞歸次數:" + count); } private static void test(char a, char b, char c, int n) { count++; if (n == 1) { move(b, c); return; } test(c, b, a, n - 1); move(b, c); test(b, a, c, n - 1); } private static void move(char a, char b) { System.out.println(a + "==>" + b); } }
用上面方法結果截圖:
上週代碼行數爲10335行,如今爲11412行,本週共1077行。
The Java Collections API contains _________ implementations of an indexed list.
A .Two
B .Three
C .Four
D .Five
解析:Java集合API中含有索引列表的三種實現。
博客中值得學習的或問題: 博客中代碼問題解決過程記錄較詳細,教材內容總結此次也增長了不少內容,博客很充實了。
結對學習內容:第九章——查找與排序,並討論了間隔排序法。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 15/15 | |
第二週 | 572/572 | 1/2 | 16/31 | |
第三週 | 612/1184 | 1/3 | 13/44 | |
第四周 | 1468/2652 | 2/5 | 13/57 | |
第五週 | 1077/3729 | 1/6 | 14/71 | 初步理解各個排序算法 |