C语言II博客作业02
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/CST2020-2 |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2020-2/homework/11810 |
| 这个作业的目标 | <数组,掌握用一维数组进行编程> |
| 学号 | <20208981> |
二、本周作业
2.1 完成PTA作业,并给出编程题完成截图


2.2 题目:快速寻找满足条件的两个数
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。
解法一:采用穷举法,从数组中任意取出两个数字,计算两者之和是否为给定的数字。
解法二:对数组中的每个数字arr[i]都判别Sum-arr[i]是否在数组中。
解法三:对数组进行排序,然后使用二分查找法针对arr[i]查找Sum-arr[i]。
要求:
1.根据三种解法给出相应的代码,并给出测试数据。(15分)

| sum | 输入 | 输出 |
|---|---|---|
| 12 | 6 6 6 6 6 6 6 6 6 6 | binggo |
| 12 | 1 2 3 4 5 6 7 8 9 10 | binggo |
![]() |
||
| sum | 输入 | 输出 |
| ---- | ---- | ---- |
| 12 | 6 6 6 6 6 6 6 6 6 6 | binggo |
| 12 | 1 2 3 4 5 6 7 8 9 10 | binggo |
![]() |
||
| 数据 | ||
| ---- | ||
| 1 2 3 4 5 6 7 8 9 10 | ||
| 9 8 7 6 5 4 3 2 1 0 |
2.请说明三种算法的区别是什么?你还可以给出更好的算法吗?
判断条件不同,运行时间不一样长
其他算法:如果数组是无序的,先排序(nlogn),然后用两个指针i,j,各自指向数组的首尾两端,令i=0,j=n-1,然后i++,j--,逐次判断a[i]+a[j]?=sum,如果某一刻a[i]+a[j]>sum,则要想办法让sum的值减小,所以此刻i不动,j--,如果某一刻a[i]+a[j]<sum,则要想办法让sum的值增大,所以此刻i++,j不动。所以,数组无序的时候,时间复杂度最终为O(nlogn+n)=O(n*logn),若原数组是有序的,则不需要事先的排序,直接O(n)搞定
2.3 请搜索有哪些排序算法,并用自己的理解对集中排序算法分别进行描述
冒泡排序;选择排序;插入排序;希尔排序;快速排序;归并排序;堆排序;
冒泡排序:从数组的第一个元素开始到数组最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,则交换这两个元素在数组中的位置,此时数组最右端的元素即为该数组中所有元素的最大值。接着对该数组剩下的n-1个元素进行冒泡排序,直到整个数组有序排列。
选择排序:设长度为n的数组arr,要按照从小到大排序,那么先从n个数字中找到最小值min1,如果最小值min1的位置不在数组的最左端(也就是min1不等于arr[0]),则将最小值min1和arr[0]交换,接着在剩下的n-1个数字中找到最小值min2,如果最小值min2不等于arr[1],则交换这两个数字,依次类推,直到数组arr有序排列。
插入排序:插入排序的基本思想就是将无序序列插入到有序序列中。例如要将数组arr=[4,2,8,0,5,1]排序,可以将4看做是一个有序序列(图中用蓝色标出),将[2,8,0,5,1]看做一个无序序列。无序序列中2比4小,于是将2插入到4的左边,此时有序序列变成了[2,4],无序序列变成了[8,0,5,1]。无序序列中8比4大,于是将8插入到4的右边,有序序列变成了[2,4,8],无序序列变成了[0,5,1]。以此类推,最终数组按照从小到大排序。
希尔排序:先将待排记录序列分割成为若干子序列分别进行插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序。
快速排序:过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。一趟快速排序的具体过程可描述为:从待排序列中任意选取一个记录(通常选取第一个记录)作为基准值,然后将记录中关键字比它小的记录都安置在它的位置之前,将记录中关键字比它大的记录都安置在它的位置之后。这样,以该基准值为分界线,将待排序列分成的两个子序列。
归并排序:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]([x]表示不小于x的最小整数)个长度为2(或者是1)的有序子序列,再两两归并。如此重复,直到得到一个长度为n的有序序列为止。
堆排序:将待排序列构造成一个大顶堆(或小顶堆),整个序列的最大值(或最小值)就是堆顶的根结点,将根节点的值和堆数组的末尾元素交换,此时末尾元素就是最大值(或最小值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值(或次小值),如此反复执行,最终得到一个有序序列。
2.4 请给出本周学习总结
1 学习进度条
| 周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
|---|---|---|---|---|
| 第一周 | 18h | 168 | 文件的使用 | 对指针不了解 |
| 第二周 | 20h | 236 | 数组,掌握用一维数组进行编程 | 字符数组和字符常量的区别 |
2 累积代码行和博客字数

对于冒泡排序法:
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。
3 学习内容总结和感悟
1.这一章的主要内容是数组,通过对数组的学习,我能够运用数组解决更多复杂的问题,但是尽管用数组解决问题,更加方便,但不得不承认,这一章的题目难度也明显增高,挑战性也随之增强
2.对于C语言的学习还需要更多的主动性,多多刷题
3.对于不懂的知识积极的去探索,多去百度



浙公网安备 33010602011771号