墨鱼崽崽


私信TA

用户名:dotcpp0714187

访问量:303

签 名:

等  级
排  名 10674
经  验 1072
参赛次数 0
文章发表 7
年  龄 23
在职情况 待业
学  校
专  业

  自我简介:

解题思路:

    第一步:利用for循环依次输入10个元素。

    第二步:利用冒泡排序(for循环与if判断的嵌套)将10个元素正序排序。

    第三步:利用for循环依次输出10个元素。

注意事项:

   冒泡排序:顾名思义,会像冒泡泡一样,一个一个浮上来。

我们从底部向上看,相邻的两个元素进行比较,若底部元素大于上面的元素,则调换位置。

例如:


原始第一次第二次第三次第四次结果
000004
444440
222333
33
3222
111111

像不像冒泡泡一样?慢慢的将最大的元素,放到了顶部?我们称为第一趟。


我们需要在该结果的基础上,在进行几趟。

第二趟:


原始第一次第二次第三次第四次结果
444444
000033
333300
222222
111111

第三趟:



原始第一次第二次第三次第四次结果
444444
333333
000222
222000
111111

第四趟:



原始第一次第二次第三次第四次结果
444444
333333
222222
001111
110000


由此可以发现我们在外面经历过了n-1趟(n为元素个数),我们这里称为外循环

有人可能就要问了——既然有外循环,那肯定也有内循环吧?

没错!确实存在内循环。我们观察一下这几趟得出的结果。


第一趟第二趟第三趟第四趟
4444
0333
3022
2201
1110

发现了嘛?每经过一趟,我们总能得出该趟的最大的数。第一趟得出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 人评分

  评论区

  • «
  • »