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. 【PTA 天梯赛】L3-002 特殊堆栈(二分)

    堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除).本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的 ...

  2. C语言写的2048小游戏

    基于"基于C_语言的2048算法设计_颜冠鹏.pdf" 这一篇文献提供的思路 在中国知网上能找到 就不贴具体内容了 [摘 要] 针对2048的游戏规则,分析了该游戏的算法特点,对其 ...

  3. mvc.net路由中带特殊字符如【.*/\】等时遇到的天坑

    用mvc.net的路由做网站伪静态时出现的天坑,自己一直没测试出来,竟然要靠客户被坑了后才知道 解决办法 参考https://stackoverflow.com/questions/16581184/ ...

  4. 课时9.HTML发展史(了解)

    这个图片里的时间不用都记住,只需要记住一些特殊的,1993年,1995年(在W3C接手以后,才有了真正意义上的标准),1999年这几个时间 WHATWG的目的是推广HTML的标准,HTML5是浏览器厂 ...

  5. goland实现函数式链式编程

    先来看一段代码 package main import ( "fmt" elastic "gopkg.in/olivere/elastic.v2" ) type ...

  6. go基础语法-变量定义

    1.基础定义 变量类型在变量名后 var a int var s string 2.定义并赋值 var a,b int = 1,2 var s string="abc" 3.类型推 ...

  7. kaggle之数据分析从业者用户画像分析

    数据为kaggle社区发布的数据分析从业者问卷调查分析报告,其中涵盖了关于该行业不同维度的问题及调查结果.本文的目的为提取有用的数据,进行描述性展示.帮助新从业的人员更全方位地了解这个行业. 参考学习 ...

  8. 1135: [POI2009]Lyz

    1135: [POI2009]Lyz https://lydsy.com/JudgeOnline/problem.php?id=1135 分析: hall定理+线段树连续区间的最大的和. 首先转化为二 ...

  9. Yii2 使用 faker 生成假数据

    测试过程中有时候需要生成大量的假数据,faker 是一个生成假数据的类库,可以生成姓名,电话,IP地址,密码,ISBN等等你能想到的或者你想不到的各种类型的假数据. Yii2.0已经集成该类库,不用再 ...

  10. cogs87 乘积最大

    cogs87 乘积最大 原题链接 题解 竟然不用高精... f[i][j]表示前i位数j个乘号的最大数f[i][j]=max{f[i-l][j-1]*num[i-l+1][i]} num[a][b]表 ...