解题思路:
第一步:利用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分
3 人评分
输出正反三角形 (C语言代码)格式错误!!!浏览:1177 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:686 |
C语言程序设计教程(第三版)课后习题6.5 (C++代码)浏览:487 |
【矩阵】 (C++代码)浏览:999 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:490 |
C语言训练-自由落体问题 (C语言代码)浏览:650 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:1321 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:525 |
C二级辅导-阶乘数列 (C语言代码)浏览:583 |
数列排序 (C语言代码)浏览:674 |