C语言II博客作业02

这个作业属于哪个课程 2020级计科三班
这个作业要求在哪里 作业要求
这个作业的目标 使用构造数据类型—数组进行数据的处理
学号 <20209013>

2.1 完成PTA作业,并给出编程题完成截图

2.1.1


2.1.2


2.2 题目:快速寻找满足条件的两个数

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。

解法一:采用穷举法,从数组中任意取出两个数字,计算两者之和是否为给定的数字。

解法二:对数组中的每个数字arr[i]都判别Sum-arr[i]是否在数组中。

解法三:对数组进行排序,然后使用二分查找法针对arr[i]查找Sum-arr[i]。

区别:
     解法一求两者之和是否为给定的数字,解法二和解法三是用给定的数字求满足的数组中的数,最后都是求两个在数组中的数。
     解法一:用穷举法把数组中的数一个一个代入if语句中一个一个判断二个数组中的数之和是否为给定的数字,其时间复杂度为N(N-1)/2即O(N^2)。
     解法二:用一个在数组中的数去求一个数组中的另一个数,代入if语句中去判断数组中的另一个数是否为给定的数字减去这个在数组中的数,其时间复杂度是O(Nlog2N)。
     解法三:用二分查找法数组中的二个数两者之和是否为给定的数字,二分查找法是一种效率较高的查找方法,把要找的数通过二分查找法慢慢缩短范围最后找出来,但一定要按大小排序,其时间复杂度 
            是O(2log2N)。

2.3 请搜索有哪些排序算法,并用自己的理解对集中排序算法分别进行描述。

冒泡排序:比较相邻的元素,大的数向后排,最大的数排在最后之后,针对所有的元素重复大的向后排,除了最后一个,直到没有任何一对数字需要比较,其时间复杂度:O(n²)。
插入排序:从数组第2个元素开始抽取元素,把它与左边第一个元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较下去,直到遇到不比它大的元素,然后插到这个元素的右边,重复上述的循环 
         直到排序结束,时间复杂度:O(n2)。
选择排序:特点就是简单直观,把排序的序列里找到最小元素放到序列的首端,在剩下的元素中的最小元素放到待序列的首端,重复进行直到排序结束,其时间复杂度:O(n²)。
快速排序:选择一个关键值作为基准值,比基准值小的都在左边序列,比基准值大的都在右边序列,用基准值和最后一个值比较比基准值小的交换位置,比基准值大的位置不变,找到后又从前往后开始比较, 
         如果有比基准值大的交换位置,重复上述的循环直到排序结束,其时间复杂度为:nlog(n)。
希尔排序:了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,接着让 h = n / 4,让 h 一直缩小, 
         当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了,对各个分组进行插入的时候并不是先对一个组排序完了再来对另一个组排序,而是轮流对每个组进行排序,时 
         间复杂度:O(nlogn)。
归并排序:(1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
         (2)设定两个指针,最初位置分别为两个已经排序序列的起始位置。
         (3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。
         (4)重复步骤3直到某一指针达到序列尾。
         (5)将另一序列剩下的所有元素直接复制到合并序列尾。
              其时间复杂度为:nlog(n)。
快速排序:从数组中选择一个元素,我们把这个元素称之为中轴元素吧,然后把数组中所有小于中轴元素的元素放在其左边,所有大于或等于中轴元素的元素放在其右边,显然,此时中轴元素所处的位置的是 
         有序的,时间复杂度:O(nlogn)  。
堆排序:  堆排序就是把堆顶的元素与最后一个元素交换,交换之后破坏了堆的特性,我们再把堆中剩余的元素再次构成一个大顶堆,然后再把堆顶元素与最后第二个元素交换….如此往复下去,等到剩余的元 
         素只有一个的时候,此时的数组就是有序的了,时间复杂度:O(nlogn) 。
计数排序:把数组元素作为数组的下标,然后用一个临时数组统计该元素出现的次数,例如 temp[i] = m, 表示元素 i 一共出现了 m 次。最后再把临时数组统计的数据从小到大汇总起来,此时汇总起来是 
         数据是有序的,时间复杂度:O(n+k)  K表示临时数组的大小。
桶排序:  把最大值和最小值之间的数进行瓜分,例如分成  10 个区间,10个区间对应10个桶,我们把各元素放到对应区间的桶中去,再对每个桶中的数进行排序,可以采用归并排序,也可以采用快速排序 
         之类的,时间复杂度:O(n+k)。
基数排序:先以个位数的大小来对数据进行排序,接着以十位数的大小来多数进行排序,接着以百位数的大小……排到最后,就是一组有序的元素了,时间复杂度:O(kn)。

2.4 请给出本周学习总结

1 学习进度条

这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
第一周3.3-3.8 15小时 120行 文件存储 对于文件还是看的不懂
第二周3.10-3.15 18小时 140行 一维数组和排序算法 排序算法不熟
2 累积代码行和博客字数

3 学习内容

  • 冒泡排序
    比较相邻的元素,大的数向后排,最大的数排在最后之后,针对所有的元素重复大的向后排,除了最后一个,直到没有任何一对数字需要比较

posted @ 2021-03-16 20:09  毁灭的雨  阅读(72)  评论(0编辑  收藏  举报