20162302 《程序设计与数据结构》第三周学习总结

20162302 2017-2018-1 《程序设计与数据结构》第三周学习总结

教材学习内容总结

选择排序
插入排序
冒泡排序
快速排序
归并排序

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

  • 问题1:和结对伙伴在对于教材上的选择排序的工作原理产生争执,事后发现是在交换数据位置的时间上有分歧。
  • 一种理解是交换位置套在最内层for循环

  • 另一种理解是套在外层for循环

  • 问题1解决方法:
    具体的方法就是调用观察运行结果

    第一种方法可以看到出了一个非常明显的错误

    第二种方法就可以得到正确的结果

在经过我们两个人的研究之后,发现,如果把交换的过程附在内层for循环,就需要在写一些继续扫描后面内容的代码以保证扫描的完整性

  • 问题2:将选择排序应用到数组里面
  • 问题2解决方案:
    自己写出来的代码和书上的范例差距不大
public void selection(int[] data){
        int min;
        for(int i = 0; i<data.length; i++){
            min = i;
            for (int j=i+1;j<data.length;j++){
                if(data[j]<data[min])
                    min = j;
            }
            exchange(data, min, i);
        }
    }
  • 问题3:将插入排序法应用到数组
  • 问题2解决方案:
    关于在条件的判断的方面相对于课本上的略显笨拙
public void insertion(int[] data) {
        //插入排序
        for (int i = 0; i < data.length; i++) {
            int a = data[i];
            for (int j = i + 1; j < data.length; j++) {
                if (data[j] < data[i]) {
                    int d = data[j];
                    int n = j;
                    while (n != i) {
                        data[n] = data[n - 1];
                        n--;
                    }
                    data[i] = d;
                }
            }
        }
    }

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

  • 问题:在编写算法复杂度-3中的最后一个代码的时候排序工作量太大。

  • 解决方案:优化代码,跳过排序的环节,降低复杂的

  • 这个是排序后在提取第一位和最后一位的思路,排序的代码之前就写好了,所以思路相对简单复杂度为O(n^2)

public void qwer(int[] data){
        for (int i = data.length - 1; i >= 0; i--) {
            for (int j = 0; j < i; j++) {
                if (data[j] > data[j + 1])
                    exchange(data, j, j + 1);
            }
        }
        System.out.println("The min:" + data[0]);
        System.out.println("The max:" + data[data.length - 1]);
    }
    public void exchange(int a[], int b, int c) {
        int qwe = a[b];
        a[b] = a[c];
        a[c] = qwe;
    }
  • 这个是简化后的代码,复杂度为O(n)
public void asdf(int[] data){
        int min = data[0], max = data[0];
        for (int i = 0; i<data.length; i++)
            if (min<data[i])
                min  = data[i];
        for (int i = 0; i<data.length; i++)
            if (min>data[i])
                max  = data[i];
        System.out.println("The min:" + data[0]);
        System.out.println("The max:" + data[data.length - 1]);
    }

代码托管

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • 叙述的问题很清晰,讲解很仔细
    • 在排版上黑界面中放一张白色为主体的有些突兀
    • 结构清晰

本周结对学习情况

  • 20162319

  • 结对学习内容:
    研究选择排序法的代码表现形式

其他(感悟、思考等,可选)

这周是从我开始接触程序设计以来第一次出现了结对学习的落实。由于结对伙伴的缘故,以前大部分时间都是单打独斗和辅导。在辅导对方的时候,自己并未得到发展,只是加强巩固自己之前的基础,相对于结对学习提高要小不少。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/10
第二周 ??/?? 1/2 15/25
第三周 465/465 1/3 15/40

参考资料

posted @ 2017-09-24 18:08  20162302  阅读(179)  评论(3编辑  收藏  举报