解题思路:
第一步:利用for循环依次输入10个元素。
第二步:利用冒泡排序(for循环与if判断的嵌套)将10个元素正序排序。
第三步:利用for循环依次输出10个元素。
注意事项:
冒泡排序:顾名思义,会像冒泡泡一样,一个一个浮上来。
我们从底部向上看,相邻的两个元素进行比较,若底部元素大于上面的元素,则调换位置。
例如:
原始 | 第一次 | 第二次 | 第三次 | 第四次 | 结果 |
0 | 0 | 0 | 0 | 0 | 4 |
4 | 4 | 4 | 4 | 4 | 0 |
2 | 2 | 2 | 3 | 3 | 3 |
3 | 3 | 3 | 2 | 2 | 2 |
1 | 1 | 1 | 1 | 1 | 1 |
像不像冒泡泡一样?慢慢的将最大的元素,放到了顶部?我们称为第一趟。
我们需要在该结果的基础上,在进行几趟。
第二趟:
原始 | 第一次 | 第二次 | 第三次 | 第四次 | 结果 |
4 | 4 | 4 | 4 | 4 | 4 |
0 | 0 | 0 | 0 | 3 | 3 |
3 | 3 | 3 | 3 | 0 | 0 |
2 | 2 | 2 | 2 | 2 | 2 |
1 | 1 | 1 | 1 | 1 | 1 |
第三趟:
原始 | 第一次 | 第二次 | 第三次 | 第四次 | 结果 |
4 | 4 | 4 | 4 | 4 | 4 |
3 | 3 | 3 | 3 | 3 | 3 |
0 | 0 | 0 | 2 | 2 | 2 |
2 | 2 | 2 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 |
第四趟:
原始 | 第一次 | 第二次 | 第三次 | 第四次 | 结果 |
4 | 4 | 4 | 4 | 4 | 4 |
3 | 3 | 3 | 3 | 3 | 3 |
2 | 2 | 2 | 2 | 2 | 2 |
0 | 0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 0 | 0 | 0 |
由此可以发现我们在外面经历过了n-1趟(n为元素个数),我们这里称为外循环。
有人可能就要问了——既然有外循环,那肯定也有内循环吧?
没错!确实存在内循环。我们观察一下这几趟得出的结果。
第一趟 | 第二趟 | 第三趟 | 第四趟 |
4 | 4 | 4 | 4 |
0 | 3 | 3 | 3 |
3 | 0 | 2 | 2 |
2 | 2 | 0 | 1 |
1 | 1 | 1 | 0 |
发现了嘛?每经过一趟,我们总能得出该趟的最大的数。第一趟得出4,剩下的只需要在1,2,3,0中选,需比较3次;第二趟得出除4以外第二大的3,剩下的只需要在1,2,0中选,需比较2次······以此类推。会发现内部真正比较的次数在随着趟数的增加而递减,为n-1-i次。(n为元素个数,i为外循环的次数)我们称为内循环。
那怎么用代码表示?
不如用for循环的嵌套来解决。
外层for循环每执行一次,内部for循环减一次。
参考代码:
#include<stdio.h> int main() { int arr[10],i,j,temp; for(i=0;i<10;i++) //依次输入10个元素 { scanf("%d ",&arr[i]); } for(i=0;i<10-1;i++) //外循环,重复操作n-1趟 { for(j=0;j<10-1-i;j++) //内循环,重复操作n-1-i次。即外层for循环每执行一次,内部for循环减一次。 { if(arr[j]>arr[j+1]) //if判断,如果前一项大于后一项,则调换位置 { temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } for(i=0;i<10;i++) //输出数组 { printf("%d\n",arr[i]); } return 0; }
(本人是新人,如有讲的不清楚的或错误的地方,还请多多指正。)
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复