终于结束了各类不一样类型的数据结构的学习,本章的内容转向了对于不一样数据结构中存储的数据的处理方面,主要学习了两部份内容——查找和排序,其中查找介绍了两种方法,排序除上学期学过的两种排序方法,又学习了四种新的排序方法。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 |