1.作业头
二、本周作业(总分:50分)
2.1 完成PTA作业,并给出编程题完成截图(5分)
(1)7-1
(2)7-2
2.2 题目:快速寻找满足条件的两个数
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。
解法一:采用穷举法,从数组中任意取出两个数字,计算两者之和是否为给定的数字。
测试数据
数组数据 |
定值 |
结果 |
1 2 3 4 5 |
5 |
1 4,2 3 |
1 2 3 4 5 6 7 8 9 |
6 |
1 5,2 4 |
解法二:对数组中的每个数字arr[i]都判别Sum-arr[i]是否在数组中。
测试数据
数组数据 |
定值 |
结果 |
2 4 7 0 3 1 5 6 |
10 |
4 6,7 3 |
8 2 6 4 9 5 3 |
12 |
4 8, 9 3 |
解法三:对数组进行排序,然后使用二分查找法针对arr[i]查找Sum-arr[i]。
测试数据
数组数据 |
定值 |
结果 |
1 2 3 4 5 6 |
6 |
1 5,2 4 |
9 6 3 2 1 4 7 8 5 |
6 |
2 4, 1,5 |
1.根据三种解法给出相应的代码,并给出测试数据。(15分)
2.请说明三种算法的区别是什么?你还可以给出更好的算法吗?(10分)
(1):第一种,通过两个循环找出所有符合条件的每对数。
(2):第二种,通过特定值减去给定数组中所有元素,得到的元素在一个新的数组K[]中,再找出两个数组中相同的元素给到新的一个数组z[]中,
但是有时候相同元素的个数是奇数不能直接输出,所以还要通过循环找出其中相加等于特定值的每对满足条件的数。
(3):第三种,数组排好顺序后从数组的两边同时找,如果找到的和大于特定值,或小于特定值,则缩短边界,继续往下找,找到一对就输出一对。
2.3 请搜索有哪些排序算法,并用自己的理解对集中排序算法分别进行描述(5分)
选择排序法:选择排序是先保存第一个元素的下标,然后后面所有的数依次与第一个元素相比,如果遇到更小的,则记录更小的那个数的下标,然后后面所有的数都依次与那个更小的数比较,直到最后将最小的数的下标找出来,然后再将这个数放到最左边,即与下标为 0 的数互换。如果最小的数的下标就是 0 那么就不用互换。
·冒泡排序法:比如说升序排列,那么就依次相邻两个数比较大小,然后把大的数放在后面。
插入排序法:它通过构建有序序列,对于未排序的数据序列,在已排序序列中从后向前扫描,找到相应的位置并插入。
希尔排序法:希尔排序在插入排序的基础上进行了改进,它的基本思路是先将整个数据序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全部数据进行依次直接插入排序
快速排序法:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
归并排序法:先使每个子序列有序,再使子序列段间有序。
2.4 请给出本周学习总结(15分)
1 学习进度条(5分)
周/日期 |
这周所花的时间 |
代码行数 |
学到的知识点简介 |
目前比较迷惑的问题 |
1/3.1 |
4h |
140 |
选择排序法和二分查找法 |
博客编程题中多个"scanf"顺序不同对答案的影响 |
2 累积代码行和博客字数(5分)
3 学习内容总结和感悟(5分)
感悟:感觉新学的知识很难,很多知识都要靠自学。
4 去了解冒泡排序,并用自己的话进行说明(5分)
冒泡排序法:比如说升序排列,那么就依次相邻两个数比较大小,然后把大的数放在后面。