20182323 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

目录

  • 学号20182323 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

    • 教材学习内容总结
    • 教材学习中的问题和解决过程
    • 代码调试中的问题和解决过程
    • 代码托管
    • 结对及互评
      • 点评模板:
      • 点评过的同学博客和代码
    • 学习进度条
    • 参考资料

目录

学号20182323 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

教材学习内容总结

第13章

查找与排序

查找

  1. 线性查找:属于无序查找算法。从序列一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。
ps:设置哨兵可提高查找效率(设第一个为哨兵,用n记录当前位置,遍历整个序列后弹出的条件为“n==0”)
  1. 二分法查找
  • 说明:元素必须是有序的,如果是无序的则要先进行排序操作。
  • 基本思想:用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

查找总结:

排序

  1. 插入排序:

    将待插元素,依次与已排序好的子数列元素从后到前进行比较,如果当前元素值比待插元素值大,则将移位到与其相邻的后一个位置,否则直接将待插元素插入当前元素相邻的后一位置,因为说明已经找到插入点的最终位置

  2. 快速排序:

    选择待排数列的首部第一个元素为基准元素,设置两指针,分别指向数列首尾部位置,假设两指针分别设为i和j。每次遍历的过程是这样的,首先遍历指针j所指向的元素,直到j指向的元素值小于基准元素时,停止遍历,将其与指针i所指向的元素进行交换,因为当前指针所指位置就是用于插入较基准元素小的元素,然后再将指针i加一。接着轮到指针i遍历,直到i所指向的元素值大于基准元素时,停止遍历,将其与指针j所指向的元素进行交换,之所以可以交换,是因为指针j所指向的元素刚刚已经交换到前半部分呢,故可以直接选择覆盖就行,这样就将大于基准元素的元素放于后半部分。依此类推,直到指针i与指针相等或者大于时,停止外部循环。最后直接将基准元素直接放置于指针i所指向的位置即可,完成分区操作。

    接下来,我们通过示图来展示上述分区算法思路的过程:

  3. 归并排序:

    简单的说把一串数,从中平等分为两份,再把两份再细分,直到不能细分为止,这就是分而治之的分的步骤. 再从最小的单元,两两合并,合并的规则是将其按从小到大的顺序放到一个临时数组中,再把这个临时数组替换原数组相应位置,这就是治. 图解如下:

排序总结:

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

  • 问题1:如何用代码实现归并排序
  • 问题1解决方案:
public static void mergeSort(int[] a,int s,int e){
    int m = (s + e) / 2;
    if (s < e){
      mergeSort(a,s,m);
      mergeSort(a,m+1,e);
      //归并
      merge(a,s,m,e);
    }
  }

  private static void merge(int[] a, int s, int m, int e) {
    //初始化一个从起始s到终止e的一个数组
    int[] temp = new int[(e - s) + 1];
    //左起始指针
    int l = s;
    //右起始指针
    int r = m+1;
    int i = 0;
    //将s-e这段数据在逻辑上一分为二,l-m为一个左边的数组,r-e为一个右边的数组,两边都是有序的
    //从两边的第一个指针开始遍历,将其中小的那个值放在temp数组中
    while (l <= m && r <= e){
      if (a[l] < a[r]){
        temp[i++] = a[l++];
      }else{
        temp[i++] = a[r++];
      }
    }

    //将两个数组剩余的数放到temp中
    while (l <= m){
      temp[i++] = a[l++];
    }
    while (r <= e){
      temp[i++] = a[r++];
    }

    //将temp数组覆盖原数组
    for (int n = 0; n < temp.length; n++) {
      a[s+n] = temp[n];
    }

  }

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

  • 问题1:
  • 出现的第一个错误是拉下了第21行的外层循环,导致指针在进行移动的时候没有在正确的位置停下来。
  • 第二个错误是第32行的arr[right]=arr[left]; 我写成了arr[lefr]=pivotkey;而丢掉了第三十六行的语句。而这个错误导致了栈溢出,“Exception in thread "main" java.lang.StackOverflowError”,
  • 第三个错误是第22行的while(left<right&&arr[right]>=pivotkey)中的判断条件我落下了“=”写成了while(left<right&&arr[right]>pivotkey)
  • 这样就会导致一个问题,当数组中出现两个相等的数时,因为判断条件中没有相等这一条,所以就不会执行while里面的语句,造成程序一直不能跳过这两个相等的数,也就是说当数组中有两个相等的元素时,程序就会执行到这里卡。
  • 解决过程:

//快速排序算法

class QuickSort{

    //主方法

    public void quicksort(int arr[],int left,int right) {

        int  pivot;

        if(left<right){

            //以pivot为枢轴,较之小的元素在左,较之大的元素在右

            pivot=partition(arr, left, right);

            //对左边的元素调用快速排序

            quicksort(arr,left,pivot-1);

            //对右边数组调用快速排序

            quicksort(arr,pivot+1,right);

        }

    }

    //快速排序算法的切割链表

    public int partition(int arr[],int left,int right){

        int pivotkey = arr[left];

        //枢轴选中后永远不变,最终在中间,前边小后变大

        while(left<right) {

            while(left<right&&arr[right]>=pivotkey)

            {

                --right;

            }

            arr[left]=arr[right];

            //此时arr[left]为空,不过它的值保存着pivot中

            while(left<right&&arr[left]<=pivotkey)

            {

                ++left;

            }

            arr[right]=arr[left];

        }

    arr[left]=pivotkey;

    return left;

    }

}

代码托管

结对及互评

点评模板:

  • 博客中值得学习的或问题:

    • 随着学习内容难度增加,问题分析更加深刻
    • 不断查阅资料,努力解决出现的问题
  • 代码中值得学习的或问题:
    • 代码的逻辑性有待提高
    • 代码中适当加入注释会更好
  • 基于评分标准,我给本博客打分:12分。得分情况如下:
  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)
    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程(2分)
  4. 代码调试中的问题和解决过程(2分)
  5. 本周有效代码超过300分行的(加0分)
  6. 其他加分:
    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分

点评过的同学博客和代码

  • 本周结对学习情况

    • 结对同学学号20182315
    • 结对照片
    • 结对学习内容
      • 查找与排序

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

        继续潜心学习,只问初心,无问西东。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 10000行 30篇 400小时
第一周 77/77 2/2 15/15
第三周 424/501 3/5 30/30
第四周 393/894 2/7 30/30
第五周 320/1214 1/8 30/30
第六周 904/2118 2/10 30/30
第7周 1350/3468 3/13 30/30
第8周 342/3810 1/14 30/30
  • 计划学习时间:25小时
  • 实际学习时间:20小时
  • 改进情况:

参考资料

原文地址:https://www.cnblogs.com/caoqian1314/p/11795683.html

时间: 2024-11-05 13:38:03

20182323 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结的相关文章

《数据结构与面向对象程序设计》第四周学习总结

20182304 2019-2020-1 <数据结构与面向对象程序设计>第四周学习总结 教材学习内容总结 1.本章我们学习了使用并编写我们自己的类:类中有与类同名的构造方法,也可以有set,get,toSring与自己定义的方法.实例化一个对象,可通过该对象使用类里的所有方法.实例数据是每次创造一个实例后自动生成新的内存空间的变量 2.uml类图 :每个类可能包含三部分内容:类名.属性.操作(方法).UML类图有属于自己的语法,变量的类型名在变量名的后面,它们之间用冒号作为分隔符,方法的+和-

20182306 2019-2020-1 《数据结构与面向对象程序设计》第五学习总结

20182306 2019-2020-1 <数据结构与面向对象程序设计>第五学习总结 教材学习内容总结 尽量简单的总结一下本周学习内容 尽量不要抄书,浪费时间 看懂就过,看不懂,学习有心得的记一下 教材学习中的问题和解决过程 问题1:XXXXXX 问题1解决方案:XXXXXX 问题2:XXXXXX 问题2解决方案:XXXXXX ... 代码调试中的问题和解决过程 问题1:XXXXXX 问题1解决方案:XXXXXX 问题2:XXXXXX 问题2解决方案:XXXXXX ... 代码托管 (stat

20182322 2019-2020-1 《数据结构与面向对象程序设计》第四周学习总结

教材学习内容总结 1.编写类与方法(构造方法的结构和用途) 2.实际参数与形式参数.public与private.return与void的区别与含义. 3.UML类图的含义与形式 4.静态类(Math类)静态变量.静态方法 5.类间关系(依赖关系.聚合关系.继承关系) 6.接口的使用,能够在某个类中实现接口的方法(Comparable.Iterator) 7.软件活动开发.方法设计.方法重载.测试(黑盒测试.白盒测试) 教材学习中的问题和解决过程 问题1:toString与return返回的值的

20182335 2019-2020-1 《数据结构与面向对象程序设计》第四周学习总结

教材学习内容总结 1.继承的基本语法与用法. 2.利用UML类图表示继承关系. 3.在具体编写类的时候,先是数据声明再是方法声明. 4.toString方法用println或print或字符串连接会自动调用. 5.每创建一个对象.都会为类中声明的变量建立新的内存空间. 6.UML图一些基础使用方法. 7.对象应该是自管理的,既对象的实例数据应该仅由该对象来修改,这就构成了封装. 代码调试中的问题和解决过程 问题1:测试代码出现错误 问题1解决方案:junit的方法名必须是textxxx或xxxt

20182323 2019-2020-1 《数据结构与面向对象程序设计》实验五报告

学号20182323 2019-2020-1 <数据结构与面向对象程序设计>实验五报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 曹骞 学号: 20182323 实验教师:王志强 实验日期:2019年10月14日 必修/选修: 必修 1.实验内容 1.Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: 参考http://www.cnblog

20182323 2019-2020-1 《数据结构与面向对象程序设计》实验六报告

学号20182323 2019-2020-1 <数据结构与面向对象程序设计>实验六报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 曹骞 学号: 20182323 实验教师:王志强 实验日期:2019年10月21日 必修/选修: 必修 1.实验内容 1.链表练习,要求实现下列功能:通过键盘输入一些整数,建立一个链表:这些数是你学号中依次取出的两位数. 再加上今天的时间.例如你的学号是 20172301 今天时间是 2018/10/1, 16:23:49秒.数字就是 20

20182323 2019-2020-1 《数据结构与面向对象程序设计》实验七报告

学号20182323 2019-2020-1 <数据结构与面向对象程序设计>实验七报告# 学号20182323 2019-2020-1 <数据结构与面向对象程序设计>实验七报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 曹骞 学号: 20182323 实验教师:王志强 实验日期:2019年10月21日 必修/选修: 必修 1.实验内容 1.定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最

20182323 2019-2020-1 《数据结构与面向对象程序设计》实验九报告

# 学号20182323 2019-2020-1 <数据结构与面向对象程序设计>实验九报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 曹骞 学号: 20182323 实验教师:王志强 实验日期:2019年12月8日 必修/选修: 必修 1.实验内容 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数.边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)(2分) 图的遍历:完成有向图

20182323 2019-2020-1 《数据结构与面向对象程序设计》第2、3周学习总结

目录 学号20182323 2019-2020-1 <数据结构与面向对象程序设计>第2.3周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 点评模板: 点评过的同学博客和代码 其他(感悟.思考等,可选) 学习进度条 参考资料 目录 学号20182323 2019-2020-1 <数据结构与面向对象程序设计>第2.3周学习总结 教材学习内容总结 第二章 print和println两种方法的区别 关键概念:pr

20182323 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结

目录 学号20182323 2019-2020-1 <数据结构与面向对象程序设计>第4周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 点评模板: 点评过的同学博客和代码 学习进度条 参考资料 目录 学号20182323 2019-2020-1 <数据结构与面向对象程序设计>第4周学习总结 教材学习内容总结 1.对象和类的关系:(类是对象的蓝图) 2.理解对象的状态(属性)和行为(操作): 3.理解类的分配