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 | 初步理解各个排序算法 |