C语言II博客作业02

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/CST2020-2/
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2020-2/homework/11810
这个作业的目标 巩固之前学习的内容,探索数组的知识
学号 20208967

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

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

2.1.根据三种解法给出相应的代码,并给出测试数据。

2.2请说明三种算法的区别是什么?你还可以给出更好的算法吗?
查找的思维不同,第一个是一个一个按照计算思维查找。第二个是利用了数学判别式查找是否存在另一半。第三个是最流行的查找方法之一,它是一种效率较高的查找方法,不过这个前提必须是有序的数组。
我觉得可以用散列表查找法,通过对记录的关键字值进行运算,直接求出结点的地址,是关键字到地址的直接转换方法。
3 请搜索有哪些排序算法,并用自己的理解对集中排序算法分别进行描述

有选择排序法,插入排序,希尔(shell)排序,冒泡排序,快速排序,堆排序等;

选择排序是在数组中找到最小的数放在数组第一个位置,然后从剩下的元素中找到最小排到第二个位置,接下来,以此类推;

插入排序对于少量元素的排序,它是一个有效的算法。它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。(插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌);

希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。

冒泡排序原理是比较两个相邻的元素,将值大的元素交换到右边。第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。比较第2和第3个数,将小数 放在前面,大数放在后面。......如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成。在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。然后依次类推。

快速排序采用分治的思想,先从数列中取出一个数作为基准数。分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。再对左右区间重复第二步,直到各区间只有一个数。

堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

4 请给出本周学习总结

4.1 学习进度条

这周花的时间 代码行数 目前迷惑的地方
第一周 10h 102 对文件相关内容疑惑,以及stlib源文件
第二周 15h 250 对数组的选择排序法理解了,但自己写总是会运行超时

4.2 累积代码行和博客字数

4.3 学习内容总结和感悟

1.数组的英文单词为array,数组能高效的处理大量的数据。在c99标准之前,声明数组时只能在方括号中使用整形常量表达式,即由整形常量构成的表达式。sizeof表达式也被视为整形常量,但是const值不是。另外,表达式的值必须大于0。以前的c90不支持例如float a8【n】这种写法,而c99标准允许这样声明,这创建了一种新型数组,称为变长数组,c11放弃了这一创新的举措,把其设定为可选,而不是语言必备的特性。
2. 在数组中不越界的前提下,为了方便和不容易搞错,可以把下标0的空间空着,从下标1开始进行处理。虽然多费了一点空间,但是这样和平时习惯一致,解题时不太容易搞混。
3.二分查找是一种非常快速的查找算法,二分查找又叫折半查找。它对要查找的序列有两个要求,一是该序列必须是有序的(即该序列中的所有元素都是按照大小关系排好序的,升序和降序都可以),二是该序列必须是顺序存储的。
4.冒泡排序的思想是从第一个数开始,两个进行比较,如果是要从小到大排序,那么如果前一个数大于后一个数,则交换位置。然后进行第二个数和第三个数进行比较......
直到进行第n-1个数和第n个数比较。之后进行第二轮,第一个数和第二个数比较,第......直到第n-2个数与n-1个数进行比较,每次减少一次比较,后面依次排下每轮最大值。冒泡排序进行的轮数为 数组个数趟-1,每轮需要比较的数为 数组个数-1-(已经进行的趟数-1)。
冒泡排序代码可写成
void bubble_sort(int arr[],int sz)
{
for(int i=0;i<sz-1;i++){
int flag=1;
for(int j=0;j<sz-1-i;j++){
int index=0;
index=arr[j];
arr[j]=arr[j+1];
arr[j+1]=index;
flag=1;
}
for(flag==0){
break;
}
}
}

posted @ 2021-03-11 18:23  魏安离  阅读(69)  评论(4编辑  收藏  举报
/梦的光点