20172333 2018-2019-1 《程序设计与数据结构》第五周学习总结

20172333 2018-2019-1 《程序设计与数据结构》第五周学习总结

教材学习内容总结

==《Java软件结构与数据结构》第九章-排序与查找==

一、查找

  • ①.查找概念: 在一个项目中寻找一个元素或者判断一个元素是否存在在这个项目中。
  • ②.查找的类型: 查找在第九章主要讨论了两种类型,一种是线性查找、另一种是二分查找。
  • ③.查找的目标: 查找实际就是不同元素之间的比较过程,而查找的目标就是为了找到某个元素,在查找的同时保持最高效的性能。

二、线性查找法

  • ①.线性查找法的概念: 如果该项目为某类型的列表,则线性查找法的实现既是从头到尾依次比较每一个值,直到找到或者遍历到最后。
  • 线性查找示意图
  • ②.方法实现:
public static <T>
        boolean linearSearch(T[] data, int min, int max, T target)
    {
        int index = min;
        boolean found = false;

        while (!found && index <= max)
        {
            found = data[index].equals(target);
            index++;
        }

        return found;
    }

三、二分查找法

  • ①.二分查找概念: 二分查找每一次查找都将现有元素组缩减一半可行候选项,大大加强效率。图二分
  • ②.二分查找前提要求: ==该元素组应该是已排序好了的。==
  • ③.二分查找法实现:
public static <T extends Comparable<T>>
        boolean binarySearch(T[] data, int min, int max, T target)
    {
        boolean found = false;
        int midpoint = (min + max) / 2;  // determine the midpoint

        if (data[midpoint].compareTo(target) == 0)
            found = true;

        else if (data[midpoint].compareTo(target) > 0)
        {
            if (min <= midpoint - 1)
                found = binarySearch(data, min, midpoint - 1, target);
        }

        else if (midpoint + 1 <= max)
            found = binarySearch(data, midpoint + 1, max, target);

        return found;
    }
  • ④.线性查找与二分查找的优劣比较:

    • 线性查找的优势:在于比二分查找更加简单,==调试与编程更容易==。线性查找==无需对队列进行排序即可使用==
    • 二分查找的优势:线性查找的时间复杂度为==O(n)==,二分查找的时间复杂度为==O(log2 n)==,在随着n的变大,二分查找的效率会远远高于线性查找。

四、排序

  • ①.排序概念:

    • 1.排序是按照某个特定要求,对一组元素进行升序或者降序的规律进行排序。
    • 2.根据效率分为两类排序:顺序排序、对数排序
    • 3.顺序排序根据方法实现不同分为三种:选择排序、插入排序、冒泡排序。
    • 4.对数排序根据方法实现不同分为两种:快速排序、归并排序。

五、顺序排序

  • ①选择排序法概念: 遍历一次列表所有元素,将最大或最小的元素放在第一位,然后再次遍历该列表除此之外的元素,重复这些操作直到最后一位元素。选择示意图
  • 代码实现:
public class SelectionSort {

    public static void selectionSort(int[] a) {
        int n = a.length;
        for (int i = 0; i < n; i++) {
            int k = i;

            for (int j = i + 1; j < n; j++) {
                if (a[j] < a[k]) {
                    k = j;
                }
            }

            if (k > i) {
                int tmp = a[i];
                a[i] = a[k];
                a[k] = tmp;
            }
        }
    }

    public static void main(String[] args) {
        int[] b = { 49, 38, 65, 97, 76, 13, 27, 50 };
        selectionSort(b);
        for (int i : b)
            System.out.print(i + " ");
    }
}
  • ②插入排序法概念: 该排序法的用法就是从左第二元素开始向左或者右进行一个一个比较,每一次比较有两种情况,若是按照从小往大排的话,提出的元素与它现有位置左边的小则该元素向左移动一位,而之前的元素向后一位;如果提出元素比它左边位置的大则停止该元素的比较,开始下一个元素的比较。
  • 插入排序法示意图
  • 插入排序法代码实现:
public static void insertSort(int[] numbers)
    {
    int size = numbers.length;
    int temp = 0 ;
    int j =  0;

    for(int i = 0 ; i < size ; i++)
    {
        temp = numbers[i];

        for(j = i ; j > 0 && temp < numbers[j-1] ; j --)
        {
        numbers[j] = numbers[j-1];
        }
        numbers[j] = temp;
    }
    }
  • ③冒泡排序法概念: 这个排序方法在一定程度上与插入排序法相似,刚开始的步骤与插入排序相同,都是将一个元素与左边或者右边的元素比较,若是从小到大排序的前提,左边元素大过右边元素则向右一位继续该步骤,但是一旦小于右边元素,则该元素固定,刚刚较大的元素开始向右比较,以此类推。
  • 冒泡排序法示意图
  • 冒泡排序法代码实现:
private static void bubbleSort(int[] sortNum)
    {
        int temp = 0;
        for (int i = 0; i < sortNum.length-1; i++)
        {
            for (int j = 0; j < sortNum.length-1-i; j++)
            {
                if(sortNum[j+1]<sortNum[j])
                {
                    temp = sortNum[j];
                    sortNum[j] = sortNum[j+1];
                    sortNum[j+1] = temp;
                }
            }
        }
    }

五、对数排序

  • ①快速排序法概念: 这个方法引入了三个重要变量i、j、k,i为==左侧变量==,j为==右侧变量==,k为==基准值==。该方法开始时需选择一个k(一般选择的是第一个元素),(==第一次遍历==)然后i变量从左边一直遍历到最右边,每次将i所在元素与基准值比较,若是大于基准值的该元素与基准值进行互换位置。(==第二次遍历==)从右边开始将小于基准值的元素进行调换顺序直到最左边。此时基准值左边的元素均小于基准值,而基准值右边的元素均大于基准值,则此时分为两个区域,对于这两个区域继续进行上述步骤直到无法分开。
  • 快速排序法图示
  • 快速排序法代码实现:

public class QuickDemo {
    public static void main(String[] args)
    {
        int[] arr = { 5,2,4,9,7 };
        sort(arr, 0, arr.length - 1);
    }
    public static void sort(int arr[], int low, int high)
    {
        int l = low;
        int h = high;
        int k = arr[low];
        while (l < h)
        {

            while (l < h && arr[h] >= k
            {
                h--;// h=6
            }
            if (l < h)
            {
                int temp = arr[h];
                arr[h] = arr[l];
                arr[l] = temp;

                l++;
            }

            while (l < h && arr[l] <= k)
            {
                l++;
            }
            if (l < h)
            {
                int temp = arr[h];
                arr[h] = arr[l];
                arr[l] = temp;
                h--;
            }

        }
        print(arr);
        System.out.print("l=" + (l + 1) + "h=" + (h + 1) + "k=" + k + "\n");

        if (l > low)
        if (h < high)
            sort(arr, l + 1, high);
    
  • ②归并排序法概念: 这个方法在我看来是分为三步,第一步是分割的思想,将一组元素从中间开始分开,直到分到一个一个元素,第二步就是将分开的元素进行比较。第三步就是比较之后的合并为一组元素。
  • 归并排序法图示

六、基数排序

  • 概念:这个方法会是利用元素的位数进行排序的,分为10个组内(0,1,2,3,4,...,9)第一次从第一位开始分(即个位)放在相应组内,然后按照从0到9的顺序拿出来,再进行十位的放置,再按0到9的顺序拿出,直到这些元素最高位结束
  • 直截了当的图片解释:
  • 个位排序图
  • 十位排序图
  • 百位排序图

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

  • 问题1:插入排序与冒泡排序他们之间排序过程中有许多相似之处那么它们之间的效率方面究竟谁更好呢?
  • 解答:首先插入排序的时间复杂度为O (n^2),冒泡排序的时间复杂度为O (n^2)。所以光从时间复杂度上是无法判断的,那么我们可以直接定义他们效率相同吗?显然是不行的,在pp9.3的编写过程中就明确规定要求出该问题的答案,在测试中可以一眼看出,冒泡排序花费的时间比插入排序少一些但是操作数远大于插入排序图对比
    冒泡:
    插入:
  • 问题2:在什么情况下,二分排序法比顺序排序法效率要高呢?
  • 解答:由于二分排序法的大多方法都是递归实现排序的,且数据越多,对二分排序法时间要求不高,而顺序排序法则影响较大,如果要具体到多少个元素来判断零界点的话,只能具体问题具体分析。

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

  • 问题1:在使用书上自带的检测类型时,发现超出范围的问题。图
  • 解决:经过debug发现在第5个的时候超出范围了,后面检测循环条件的时候发现当第五个元素在于第七个元素比较的时候,数组为0-6,没有7则会报错,稍改一下条件就解决了图
  • 问题2:在做pp9.2的时候出现了输出地址的情况图
  • 解决:经过检查发现是使用sout的时候带入的变量错了多加一个S就出问题了。图

代码托管

-图代码

上周考试错题总结

结对及互评

基于评分标准,我给李楠的博客打分:7分。得分情况如下:

正确使用Markdown语法(加1分)

模板中的要素齐全(加1分)

教材学习中的问题和解决过程, (加3分)

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

感想,体会真切的(加1分)

点评认真,能指出博客和代码中的问题的(加1分)

点评过的同学博客和代码

  • 本周结对学习情况

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

思路很清晰,写起来就难受。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/10
第二周 0/0 1/2 10/20
第三周 1500/1500 1/3 10/30
第四周 2761/4261 2/5 25/55
第五周 814/5075 1/6 15/70

原文地址:https://www.cnblogs.com/yanyujun527/p/9800522.html

时间: 2024-07-31 07:36:19

20172333 2018-2019-1 《程序设计与数据结构》第五周学习总结的相关文章

20172333 2018-2019-1 《程序设计与数据结构》第九周学习总结

20172333 2018-2019-1 <程序设计与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.无向图 ①无向图的定义 图是由结点与结点相连接构成的,与树类似.这些结点被常常称作顶点(vertice),这些顶点的连接叫做边(edge). 无向图(undirected graph)是一种边为无序结点对的图. 两个顶点之间有一条连通边的顶点,我们称作它们为领接的(adjacent).这两个顶点也叫作邻居(neighbor),自己是自己的

20172330 2018-2019-1 《程序设计与数据结构》第二周学习总结

20172330 2018-2019-1 <程序设计与数据结构>第二周学习总结 教材学习内容总结 集合 1.集合是一种对象,类似于保存其他对象的存储库 集合中的元素通常是按照他们添加到集合的顺序,或者是按元素之间的某种内在联系来组织的. 2.抽象数据类型(ADT)是由数据和在该数据上所实施的具体操作构成的集合. 3.栈是一种线性集合,元素按后进先出(LIFO)的方法进行处理,有push,pop,peek,isempty,size等常用操作 4.栈是用于计算后缀表达式的理想数据结构 5.Java

20172305 2017-2018-2 《程序设计与数据结构》第一周学习总结

20172305 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 本书的第一章简单的介绍了计算机和JAVA的历史,基础内容很多,代码的讲解还没用正式进入,本周一直在做敲代码的准备,简单敲了老师给的"Hello World!"以及书后的PP1.3.PP1.4等简单的小程序. 教材学习中的问题和解决过程 问题1:三种不同类型的错误,运行错误和逻辑错误的混淆 问题1解决方案:针对EX1.20的"希望做加法时却做里乘法"进行了网上

20172314 2017-2018-2 《程序设计与数据结构》第一周学习总结

20172314 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 本书第一章为计算机系统概述,前面是一些计算机相关的基础知识,让我对计算机有了一个总体的认识,不再是一片空白了,对主存储器和CPU影响深刻,主存储器用于保存程序和数据,CPU执行程序指令.在接下来的Java编程语言与程序开发部分,开始看的时候有点迷茫,不是很理解,后来先按照作业中附带的流程完成一些代码托管之后,接触了完整的简单的程序之后,再回过头来看书,看到的一些陌生的名词在脑海中就有了实际的对应,

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

20172317 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 重新温习了一遍计算机的基础 总算了解了局域网广域网因特网万维网这些东西之间的区别了 通过URL的例子知道了网址各个部分的含义 对Java编程语言和程序开发有了一个粗浅的了解 教材学习中的问题和解决过程 问题:练习题SR1.13出现了答案与题目不相符的情况 问题解决方案:题中有个选项是"网卡",答案中没有,反而有个题目没有的选项"调制解调器"(俗称"

20172322 2017-2018-2 《程序设计与数据结构》第二周学习总结

20172322 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 了解了print与println的区别 了解了字符串的拼接可以用+来完成 了解了转义字符的使用 学会了使用赋值 学会使用部分算术运算符 学会了使用Scanner来实现交互性 教材学习中的问题和解决过程 问题1:在最初接触赋值时对foalt和double的赋值范围不了解 问题1解决方案:使用万能的度娘后看到一个高赞答案后有了了解 问题2:在提前预习时看到2.7图形后敲入的代码无法执行 问题2解决方案

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

20172328李馨雨<程序设计与数据结构>第二周学习总结 又到周五,李馨雨同学要开始写博客了.让我们开始吧!(????) 教材学习内容总结 1.首先是String类定义的字符串,然后是print和println的区别.转义字符的学习.(让我印象深刻的\b[回车符]在字符串结尾不显示哈哈,及其更新的\t[换行符],还有在课堂上真正明白了什么是回车.) 2.了解变量.常量.赋值语句.变量:保存数据的内存单元.常量:坚定自己不会变的数据!除非你用java的反射(有点复杂,改权限.去修饰符等等.没实

20172327 2017-2018-2 《程序设计与数据结构》第二周学习总结

20172327 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 字符串的拼接和转义序列的使用 变量的声明和使用 讨论语法及表达式的处理 定义数据转换类型和实现类型转换的机制 创建Scanner类 教材学习中的问题和解决问题 暂无 代码学习中的问题和解决过程 问题1:在提交过程中,突然遇到无法上传的情况 问题2解决方案:通过上网查找,输入git pull之后弹出一个编辑框,选择关闭之后,再次用git push就成功了. 问题2:在按照例题2.10打代码时,Jav

学号20172328《程序设计与数据结构》第九周学习总结

学号20172328<程序设计与数据结构>第九周学习总结 教材学习内容总结(异常和递归) 第11章:异常 1.[异常处理]: 一个异常:是一个定义非正式情况或错误的对象,由程序或者运行时环境抛出,可以根据需要捕获和处理. 错误:错误类似于异常,但是错误代表不可恢复的问题并且必须捕获处理. 2.[处理异常的三种方法]:①根本不处理异常②当异常发生时处理异常③在程序的某个位置集中处理异常. 3.[未捕获的异常]:如果程序中不处理异常,则程序将非正常的终止运行,并产生关于描述在何处发生什么异常的信息

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

学号 20172326 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常(exception):定义非正常情况下或错误的情况的对象,由程序或运行时环境抛出,可根据需要进行相应的捕获处理. 异常与错误的区别:错误代表不可恢复的问题并且必须捕获处理.而异常可以忽视,或者使用try语句处理,或调用更高级的方法. 可检测异常与不可检测异常:可检测异常必须由方法捕获,或者必须在可能抛出或传递异常方法的throws子句中列出来.在方法定义的声明头中追加一条throws子句.不可检测异常不需要使