2018-2019-20172321 《Java软件结构与数据结构》第五周学习总结

教材学习内容总结

第9章 排序与查找

9.1查找

  • 查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素。对其进行查找的项目组有时也称为查找组。

  • 两种常见的查找方式:线性插找、二分查找

  • 要尽可能高效的完成查找,要最小化比较操作次数,通常,查找池里项目数目越多,为了寻找该目标而做出的比较操作次数就越多,因此,该查找池中项目的树目定义了该问题的大小。

  • 9.1.3线性查找法

    • 如果该查找池组织成了一个某类型的列表,那么完成该查找的一个简单方式就是从该列表头开始一次比较每一个值,直到找到该目标元素为止。
    • 示意图

- 平均查找长度: 1/2(n+i)
- 时间复杂度: O(N)
  • 9.1.4二分查找法

    • 二分查找是从排序列表的中间开始查找,而不是从一端或另一端开始。如果没有在那个中间元素找到目标元素则继续查找。
    • 二分查找将利用查找池中的项目组是已排序的这一事实。
    • 示意图

- 平均查找长度: (n+1/n)*(log2(n+1))-1
- 时间复杂度: O(logN)
  • 查找算法的比较

    • 二分查找的每次比较都会删除一半的可行候选项
    • 二分查找的复杂度是对数级的,这使得它对大型查找池非常有效率

9.2排序

  • 排序是这样一个过程,即基于某一标准,要么以升序要么以降序将某一组项目按照某个规定顺序排列。

  • 顺序排序:选择排序、插入排序、冒泡排序

  • 对数排序:快速排序、归并排序

  • 9.2.1选择排序法

    • 选择排序算法通过反复地将某一特定值放到它在列表中的最终已排序位置,从而完成对某一列值的排序。
    • 时间复杂度:O(n^2)
    • 示意图

  • 9.2.2插入排序法

    • 插入排序算法通过反复的将某一特定值插入到该列表某个已排序的子集中来完成对列表值的排序。
    • 时间复杂度:O(n^2)
    • 示意图

  • 9.2.3冒泡排序法

    • 冒泡排序算法通过重复的比较相邻元素且在必要时将他们互换,从而完成对某个列表的排序。
    • 时间复杂度:O(n^2)
    • 示意图

  • 9.2.4快速排序法

    • 快速排序算法通过将列表分区,然后对这两个分区进行递归式排序,从而完成对整个列表的排序
    • 时间复杂度:O(nlgn)
    • 示意图(快速排序(Quicksort)是对冒泡排序的一种改进。)

  • 9.2.5归并排序法

    • 归并排序算法通过将列表递归式分为两半直至每一字列表都含有一个元素,然后将这些字列表归并到一个排序顺序中,从而完成对列表的排序。
    • 时间复杂度:O(nlgn)
    • 示意图

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

  • 问题1:选择排序与插入排序的区别,课本中提及到两个排序的概念:

    • 选择排序算法是反复的将一个个具体的值放到它最终的有序位置,从而完成一组值得排序。
    • 插入排序算法是反复的将一个个具体的值插入到表的已有序的子表中,从而完成一组值得排序。
    • 这两个的概念刚开始的时候看起来好像一样,本来就有点迷,认真一想更迷了。
  • 问题1解决方案:在上课的时候听王老师讲解,王老师说选择是在有序序列里操作,后来仔细思考之后发现选择排序排出来之后之前的序列是肯定不变,而插入序列就不是,他就是在原本的有序序列之中插入一个元素。所以这就是他们的差别。

  • 问题2:为什么在查找排序时都要实现Comparable这个接口?

  • 问题2解决方案:

    • 通过查找API文档:此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
    • 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

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

  • 问题1和解决方案:首先我将pp9.2的i设定为3,然后开始编写,运行之后可以正确,但是我眉头一皱发现有两个地方并不简单,首先按照我这样的方法,如果把i改成其他的就会排序错误或者报错

同时我还发现,如果按照我现在的思路,好像运行到后来和冒泡排序就没有区别了,我再一看题,才发现是减少某个大于1的数

我这样写问题就很大了,最后我又加了一层循环

但是

最后我把 for (scan = 0; scan <= data.length - i; scan++) 的<+改成=才解决问题

代码托管

上周考试错题总结

好像没有错题,嘿嘿嘿

结对及互评

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

    • 优点:代码编写时遇到的问题记录非常详细;对书本上的内容理解也到位;这周的博客不仅交的早,质量是极高。
  • 本周结对学习情况

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

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 0/0 1/1 8/8
第二周 671/671 1/2 17/25
第三周 345/1016 1/3 15/40
第四周 405/1421 2/5 23/63
第五周 1202/2623 1/5 20/83

参考资料

2018-2019-20172321 《Java软件结构与数据结构》第五周学习总结的更多相关文章

  1. 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...

  2. 20172328 2018-2019《Java软件结构与数据结构》第一周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第一周学习总结 概述 Generalization 本周学习了软件质量.数据结构以及算法分析的具体内容,主要依托于所用教材 ...

  3. 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...

  4. 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.图及无向图 1.图的相关概 ...

  5. 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...

  6. 《JAVA软件结构与数据结构》第一周学习总结

    学号 20172326 <JAVA软件结构与数据结构>第一周学习总结 教材学习内容总结 软件质量的几大特性 增长函数与大O记法 大O记法用来表示表示增长函数,从而来表示算法的复杂度 算法的 ...

  7. 2018-2019-20172329 《Java软件结构与数据结构》第二周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 <Java软件结构与数据结构>第三章 集合概述--栈 一.集合 1.我们印 ...

  8. 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...

  9. 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...

  10. 20172329 2018-2019《Java软件结构与数据结构》第一周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第一周学习总结 在这学期就已经大二了,也已经步入了学习专业课的核心时间,在这个阶段,我们应该了解自己的学习情况,针对自己 ...

随机推荐

  1. 【模板】区间dp

    有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子合并为1堆.在合并的过程中只能每次将相邻的两堆石子合并,每次合并的花费为这两堆石子之和,求合并成1堆的最小花费. dp[i][j]表示将区间[i ...

  2. 小白的Unity5之路(一)

    Player移动: public float speed = 6f; Vector3 movement; Rigidbody playerRididbody; void FixedUpdate () ...

  3. 四、spring成长之路——springIOC容器(下)

    目录 5.spring注解开发(Spring扩展知识) 5.1定义配置类:@Configuration 声明一个类为IOC容器 @Bean定义一个Bean 5.2.按照条件进行注入 5.3.@Impo ...

  4. ElasticSearch优化系列二:机器设置(内存)

    预留一半内存给Lucene使用 一个常见的问题是配置堆太大.你有一个64 GB的机器,觉得JVM内存越大越好,想给Elasticsearch所有64 GB的内存. 当然,内存对于Elasticsear ...

  5. [试玩] FMXLinux (Firemonkey for Linux) Linux 桌面开发(第三方插件)

    FMXLinux 是一个可以用来开发 Linux 桌面软件的第三方插件,它需要配合 Delphi 10.2 Toyko 官网:http://www.fmxlinux.com/ 使用方法:开启 FMX ...

  6. 技巧-如何通过hive开发平台上传csv文件

    通过数据交换平台上传较大的文件时,经常会出现导入失败情况,换种方式通过新数据开发平台(stark)也可以轻松实现外部数据与hive的数据关联. --第一步.导入csv文件到hive --stark数据 ...

  7. 树莓派ubuntu系统下修改config.txt文件 树莓派config.txt文件修改记录

    原文:https://www.raspberrypi.org/documentation/configuration/config-txt.md译文:http://my.oschina.net/fun ...

  8. 20155212 实验三 敏捷开发与XP实践

    20155212 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器&g ...

  9. 20155214曾士轩 2016-2017-2 《Java程序设计》第1周学习总结

    20155214曾士轩 2006-2007-2 <Java程序设计>第1周学习总结 教材学习内容总结 浏览教材,根据自己的理解每章提出一个问题 1.标准API的架构指的是什么? 2.一个项 ...

  10. 通过dotnet命令行设置asp.net core服务的启动地址

    需求: 通过dotnet命令行启动asp.net core 服务时,自定义监听端口. 方法: 在program.cs中增加命令行参数配置: WebHost.CreateDefaultBuilder(a ...