20172302 《Java软件结构与数据结构》第五周学习总结


2018年学习总结博客总目录:第一周 第二周 第三周 第四周 第五周


教材学习内容总结

查找

查找即在某项目组中寻找某一指定目标元素,或确定该组中并不存在此元素。对其进行查找的项目组称为查找池。

1.线性查找法,即从列表头开始依次比较每一个值,直至找到该目标元素或到列表尾未找到,这是一种最简单的查找方式,但它的效率并不是高效的。
2.二分查找法一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn)。
3.两种查找方法对比:线性查找要比二分查找简单,易于调试;同时,线性查找无需花费额外成本排序该列表。对于小型问题,这两种算法几乎不存在实用差别,但n变大后,二分查找就会变得很有效率。

排序

排序:基于某一标准,按照某个规定顺序对某一项目组进行顺序排列。基于效率排序算法可分为两类:顺序排序(需要进行n²次比较);对数排序(需要进行nlog(2)n次比较)。

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.基数排序法:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.

  • 各种排序算法效率比较:

    基数排序中:r代表关键字的基数,d代表长度,n代表关键字个数

教材学习中的问题和解决过程

  • 问题1:“@SuppressWarnings("unchecked")”是有什么作用?

  • 问题1解决方案:java.lang.SuppressWarnings是J2SE5.0中标准的Annotation之一。可以标注在类、字段、方法、参数、构造方法,以及局部变量上。
    作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。
    使用:
    @SuppressWarnings(“”)
    @SuppressWarnings({})
    @SuppressWarnings(value={})
    书上的这处使用是 @SuppressWarnings("unchecked"),告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。

  • 问题2:

  • 问题2解决方案:

代码调试中的问题和解决过程

  • 问题1:关于PP9.2,读了两次题目,第一遍没读明白,第二遍读不懂“将i减少某个大于1的数量i并继续该过程直至i小于1”,并且在第一次做完后结果正确,但我感觉做的不对。

  • 问题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,如何来查看代码的运行时间?

  • 问题2解决方案:查找资料,参见: java测试代码段执行时间
    按照所给的方法,进行添加,
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+" 秒 ");

运行结果见图:

代码托管

上周代码行数为10335行,现在为11412行,本周共1077行。

上周考试错题总结

  • The Java Collections API contains _________ implementations of an indexed list.
    A .Two
    B .Three
    C .Four
    D .Five

  • 解析:Java集合API中含有索引列表的三种实现。

结对及互评

  • 本周结对学习情况
    • 20172308
    • 博客中值得学习的或问题: 博客中代码问题解决过程记录较详细,可适当添加教材内容总结。

    • 结对学习内容:第九章——查找与排序。

其他(感悟、思考等)

感悟

  • 这周的排序算法的代码有些复杂,排序这里能做的问题也有很多,现在能够基本明白各个算法的意思,代码有些地方理解的还差点。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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 初步理解各个排序算法

参考资料

猜你喜欢

转载自www.cnblogs.com/hzy0628/p/9786586.html
今日推荐