C语言||博客作业02
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/CST2020-4 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2020-4/homework/11824 |
这个作业的目标 | 学会运用数组和有关排序的算法知识解题 |
学号 | 20209058 |
一.本周教学内容&目标
第七章 数组 7.17.1 输出所有大于平均值的数
1.学生知道在哪种情况下可以使用构造数据类型—数组进行数据的处理
2.掌握用一维数组进行编程
3.掌握选择排序法和二分查找法
二.本周作业
2.1 完成PTA作业,并给出编程题完成截图
2.2 题目:快速寻找满足条件的两个数
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。
解法一:采用穷举法,从数组中任意取出两个数字,计算两者之和是否为给定的数字。
测试数据
解法二:对数组中的每个数字arr[i]都判别Sum-arr[i]是否在数组中。
测试数据
解法三:对数组进行排序,然后使用二分查找法针对arr[i]查找Sum-arr[i]。
测试数据
三种算法的区别:
第一种算法是遍历每一个数,将每两个不同的数相加的和与定值作比较
第二种算法是检查定值与每一个数据的差值是否在数组里,与第一种本质区别不大,时间复杂度都为O(n^2)
第三种算法先将定值与数据的差值算出来,再将最大值和最小值相加除2,并将其与得到的差值作比较,大大提高了运行效率,其时间复杂度为O(logn),底数为2
我的算法:
我的思路是首先排序数组,假设先序排序,然后两边走,如果刚好两个数之和为给定值,那么即找到;如果小于给定值,那么左边向中间走一步;如果大于给定值,那么右边向中间走一步。
2.3 请搜索有哪些排序算法,并用自己的理解对集中排序算法分别进行描述
冒泡排序:假设长度为n的数组arr,要按照从小到大排序。则冒泡排序的具体过程可以描述为:首先从数组的第一个元素开始到数组最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,则交换这两个元素在数组中的位置,此时数组最右端的元素即为该数组中所有元素的最大值。接着对该数组剩下的n-1个元素进行冒泡排序,直到整个数组有序排列。算法的平均时间复杂度为O(n^2)。
选择排序:先从待排序的数据中找出最小或最大的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中找到最大或最小元素,放到已排序的序列中的末尾,直到全部排列完,时间复杂度为O(n^2)。
插入排序:此算法是将无序序列中的数字插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止,平均时间复杂度是O(n^2)。
快速排序:从待排序序列中任意选择一个元素记为基准值,然后将比它小的数据安置在它的位置之前,比它大的安置在它位置之后,这样就以该基准值为分界线分成了两个子序列,平均时间复杂度为O(nlogn)。
2.4 请给出本周学习总结
学习进度条
周/日期 | 这周所花时间 | 代码行 | 学到的知识点简介 | 目前比较疑惑的地方 |
---|---|---|---|---|
1/3.4 | 4h | 100 | 文件的操作与存取 | file文件指针的各种操作 |
2/3.10 | 6h | 130 | 各种排序算法 | 快速排序,插入排序等算法的代码实操 |
累积代码行和博客字数
学习内容总结和感悟
- 感觉现在学习的编程内容越来越注重算法了,优秀的算法想不出来只能上网查询
- 应该花更多时间在解决方法上,不必在语法上过多纠结
- 冒泡排序:比较相邻的元素。如果第一个比第二个大,就交换他们两个,对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。每一轮比较的最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个,持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较,也就是说,需要的比较轮数为n-1,每一轮从第一个数开始比较,直到上一轮比较的最后一个数(即上一轮的最大数)的前一个数。