C语言II博客作业02
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/SE2020-4 |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/SE2020-4/homework/11808 |
| 这个作业的目标 | 学习数组掌握选择排序法和二分查找法 |
| 学号 | 20209212 |
一 PTA编程题截图
第一题截图:

第二题截图:(错了一半)

二 题目:快速寻找满足条件的两个数
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。
2.1 .根据三种解法给出相应的代码,并给出测试数据
2.1.1 解法一:采用穷举法,从数组中任意取出两个数字,计算两者之和是否为给定的数字。
代码:
#include<stdio.h>
int main ()
{
int sum;//sum为给定的值
scanf("%d",&sum);
int a[4];
for(int i=0;i<4;i++) scanf("%d",&a[i]);// 给定一个数组
for(int i=0;i<4;i++){
for(int k=i+1;k<4;k++){
if(a[i]+a[k]==sum) printf("%d和%d",i,k);//如果等于给定的值 则输出其下标
}
}
return 0;
}
测试数据:
| 输入数据sum | 输入数组值 | 输出下标 |
|---|---|---|
| 2 | 1 2 1 4 | 0和2 |
| 6 | 2 2 3 4 | 0和3 1和3 |
2.1.2解法二:对数组中的每个数字arr[i]都判别Sum-arr[i]是否在数组中。
代码:
#include<stdio.h>
int main()
{
int sum;//sum为给定的值
scanf("%d",&sum);
int a[4];
for(int i=0;i<4;i++) scanf("%d",&a[i]);// 给定一个数组
for(int i=0;i<4;i++){
int temp;
temp=sum-a[i];
for(int k=i+1;k<4;k++){
if(temp==a[k]) printf("%d和%d",i,k);
}
}
return 0;
}
测试数据:
| 输入数据sum | 输入数组值 | 输出下标 |
|---|---|---|
| 4 | 2 3 1 2 | 0和3 1和2 |
| 6 | 2 3 4 5 | 0和2 |
2.1.3解法三:对数组进行排序,然后使用二分查找法针对arr[i]查找Sum-arr[i]。
代码:
#include<stdio.h>
int main()
{
int sum,index,temp;//sum为给定的值
scanf("%d",&sum);
int a[5];
for(int i=0;i<5;i++) scanf("%d",&a[i]);
for(int k=0;k<5;k++){
index=k;
for(int i=k+1;i<5;i++){
if(a[i]<a[index]) index=i;
}
temp=a[index];
a[index]=a[k];
a[k]=temp;
}//将数组进行从小到大排序
for(int i=0,k=5-1;i<5;i++){
if(i>=k) break;
if(a[i]+a[k]==sum) printf("%d和%d\n",i,k);
else if(a[i]+a[k]>sum){k--;i--;};
};
return 0;
}
测试数据:
| 输入数据sum | 输入数组值 | 输出下标 |
|---|---|---|
| 20 | 10 11 8 9 12 | 0和4 1和3 |
| 80 | 40 41 42 38 39 | 0和4 1和3 |
2.2 请说明三种算法的区别是什么?你还可以给出更好的算法吗?
答:区别是:难易程度不一样(doge)长短不一,解题思路不一样。im sorry,这三种算法都是现学的,我没有更好的方法了。
三 请搜索有哪些排序算法,并用自己的理解对集中排序算法分别进行描述
1.冒泡排序:不断重复比较相邻的两个元素,交换两个元素使其顺序真确,重复地进行直到没有再需要交换!
2.选择排序:于冒泡排序相似,不断从未排列的数中寻找最小(大)值然后将其排列。
3.插入排序:在已排序序列中从后向前扫描,找到相应位置并插入。
4.归并排序:将已有序的子序列合并,得到完全有序的序列。
5.快速排序:先在序列中选一个数,然后将大于这个数放在右边,小于这个数的放在左边,就分成两个区,然后再将两个区排序。
6.堆排序:把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束。
7.希尔排序:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序:
8.计算排序:将输入的数据值转化为键存储在额外开辟的数组空间中....(无语 最看不懂的)
9.桶排序:将数组分到有限数量的桶子里,然后对每个桶子再分别排序,最后将各个桶中的数据有序的合并起来。
10.基数排序:将整数按位数切割成不同的数字,然后按每个位数分别比较...
四 学习总结
4,1 学习进度条
| 周/日期 | 这周花的时间 | 代码行数 | 学到的知识简介 | 目前比较困惑的问题 |
|---|---|---|---|---|
| 第一周 | 一天 | 80 | 如何读取文件 | 如何读取文件 |
| 第二周 | 一天 | 85 | 运用数组 | 代码中某些变量之间的关系 |
4.2 累积代码行和博客字数

4.3 学习内容总结和感悟


浙公网安备 33010602011771号