C语言II—作业02
1.作业头
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/SE2020-1/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/SE2020-1/homework/11821 |
这个作业的目标 | <对数组有一个初步了解和了解排序的多种写法> |
学号 | <20209110> |
一、本周作业 | |
1.1完成PTA作业,并给出编程题完成截图 | |
1.2题目:快速寻找满足条件的两个数 | |
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。 |
要求:
1.根据三种解法给出相应的代码,并给出测试数据。
解法一:采用穷举法,从数组中任意取出两个数字,计算两者之和是否为给定的数字。
解法二:对数组中的每个数字arr[i]都判别Sum-arr[i]是否在数组中。
解法三:对数组进行排序,然后使用二分查找法针对arr[i]查找Sum-arr[i]。
2.请说明三种算法的区别是什么?你还可以给出更好的算法吗?
1:穷举法枚举所有可能,思路简单,但运算量大。
2:判断法加穷举,一定程度上比较稳定。
3:二分法将元素一分为二,通过中值比较,然后左右改变的方法,缩小范围,计算更便捷。
不能给出更好的算法
1.3请搜索有哪些排序算法,并用自己的理解对集中排序算法分别进行描述
排序算法:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序、桶排序、计算排序。
1、冒泡排序:是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
2、选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
3、插入排序:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
4、希尔排序:既可以提前设定好间隔序列,也可以动态的定义间隔序列。
5、归并排序:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
6、快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
7、堆排序;是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
8、计数排序:计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。
9、桶排序:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排
10、基数排序;是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。
1.4请给出本周学习总结
1.学习进度条
周 | 时间 | 学到的知识简介 | 存在的不足 |
---|---|---|---|
第一周 | 16小时 | 使用文件来进行大量的数据计算与分析 | 还有许多知识点没弄懂,还有对上学期所学的有些生疏了 |
第二周 | 19小时 | 数组及二分法查找等知识点 | 没有很深入只是搞懂了一点点,还需要多看书多百度搜索学习,也要多打点代码 |
2.累积代码行和博客字数 | |||
3.学习内容总结和感悟
感悟:
1.现在所要学的东西是越来越难了,感觉越来越吃力了;
2.当然,所了解到的东西也越来越多了,看到的世界也变得更大了;
3.虽然我现在感觉我对这个的兴趣没有刚开始那么热烈了,但是,我是不会对它放弃的,我相信我以后也会变强的。
4.去了解冒泡排序,并用自己的话进行说明
就是将数组按照要求正确的排序,从最开始两个开始进行交换,然后再将第二个和第三个进行排序,以此类推,一直重复下去直到排序完成即停止,也就是说该数列已经排序完成。