終於結束了各類不一樣類型的數據結構的學習,本章的內容轉向了對於不一樣數據結構中存儲的數據的處理方面,主要學習了兩部份內容——查找和排序,其中查找介紹了兩種方法,排序除上學期學過的兩種排序方法,又學習了四種新的排序方法。html
public class MathTest { public static void main(String[] args) { MathTest mathTest = new MathTest(); System.out.println(mathTest.max(1, 2)); System.out.println(mathTest.max(2.0, 3.0)); } //泛型方法 private <T extends Comparable> T max(T t1, T t2) { return t1.compareTo(t2) > 0 ? t1 : t2; } //靜態泛型方法 private static <T extends Comparable> T max(T t1, T t2) { return t1.compareTo(t2) > 0 ? t1 : t2; } }
三種順序排序的時間複雜度均爲O(n^2),緣由是它們都要經過兩層循環來實現,且每層循環都要進行n次,下面主要進行兩層循環做用的分析。java
public static <T extends Comparable<T>> void selectionSort(T[] data) { int min; T temp; //循環次數爲n,時間複雜度爲O(n) for (int index = 0; index < data.length-1; index++) { min = index; //循環次數爲n,時間複雜度爲O(n) for (int scan = index+1; scan < data.length; scan++) { if (data[scan].compareTo(data[min])<0) { min = scan; } } swap(data, min, index); } }
public static <T extends Comparable<T>> void insertionSort(T[] data) { //循環次數爲n,時間複雜度爲O(n) for (int index = 1; index < data.length; index++) { T key = data[index]; int position = index; //循環次數爲n,時間複雜度爲O(n) while (position > 0 && data[position-1].compareTo(key) > 0) { data[position] = data[position-1]; position--; } data[position] = key; } }
public static <T extends Comparable<T>> void bubbleSort(T[] data) { int position, scan; T temp; //循環次數爲n-1,時間複雜度爲O(n) for (position = data.length - 1; position >= 0; position--) { //循環次數爲n,時間複雜度爲O(n) for (scan = 0; scan <= position - 1; scan++) { if (data[scan].compareTo(data[scan+1]) > 0) { swap(data, scan, scan + 1); } } } }
快速排序和歸併排序的平均時間複雜度相同,都是O(nlogn)。git
partition
。
while循環
,用於將兩個分區中對應位置錯誤的元素找到並進行交換,直至左索引與右索引相等。merge方法
來重組數組已排序的部分。
merge
方法中共有四個循環,第一個while循環將兩個子列表中的最小元素分別加入到一個臨時的數組temp中,而後第二個和第三個while循環的用處是分別將子列表中剩餘的元素加入到temp中,最後一個for循環就是將合併後的數據再複製到原始的數組中去。與以前介紹的五種排序方法不一樣,基數排序法是一種不須要進行元素之間相互比較的排序方法。算法
public class A<T> { public static void B(T t) { //報錯,編譯不經過 } }
public class A<T> {...}
修飾符 <類型參數列表> 返回類型 方法名(形參列表) {方法體}
public static <T> int A(List<T> list) { ... }
//正確 <T extends X> void func(List<T> list){ ... } //正確 <T extends X> void func(T t){ ... } //編譯錯誤 <T> void func(List<T extends X> list){ ... }
?
是怎麼回事??
是一種類型通配符,能夠表明範圍內任意類型。可是「?」泛型對象是隻讀的,不可修改,由於「?」類型是不肯定的,能夠表明範圍內任意類型。而全部能用類型通配符?
解決的問題都能用泛型方法解決,而且泛型方法能夠解決的更好。這裏有一篇博客對於二者的對比介紹的很是好。currentTimeMillis
方法,它是以毫秒計時的,而因爲排序的元素較少時間還到不了毫秒級,因此顯示的都是0,在改爲以微秒計時的nanoTime
方法後就能夠顯示了。merge
方法的循環以外,可是在遞歸的過程當中它仍是會屢次輸出。解決方法是將time
這個變量放到方法外面去,設置成public static int time = 0
便可。ArrayList
另外一種是LinkedList
。後來發現是本身看錯題了沒有看到「索引」兩個字,原話在書上120頁。代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 10/10 | 1/1 | 10/10 | |
第二週 | 246/366 | 2/3 | 20/30 | |
第三週 | 567/903 | 1/4 | 10/40 | |
第四周 | 2346/3294 | 2/6 | 20/60 | |
第五週 | 1212/4506 | 2/8 | 30/90 |