冒泡排序法--C语言双层嵌套循环解决

前言

排序是c语言中比较经典的算法,会陆续出文章把排序算法解释清楚

这篇文章首先是冒泡排序,算法比较简单,但有些地方难理解,还需要自己在草稿纸动笔推一遍,就会很容易理解

冒泡排序原理

我们根据冒泡排序的命名来简要理解,每个数字可以代表一个气泡,数字的大小就代表气泡的大小,就像水沸腾的过程,如果是从小到大排序,就是大气泡像后边飘,是水沸腾的前过程。那如果是从大到小排序,就是大气泡向前飘,是水沸腾的最后的一个过程。

冒泡排序:它重复地遍历要排序的列表,每次遍历都比较相邻的两个元素,如果它们的顺序不符合要求(比如要求从小到大排序,但两个元素的顺序是大于小),则交换这两个元素的位置,直到整个列表排序完成。

现在,我们通过一个例子来理解一下吧!

给出任意一串数字,从小到大排序:

38 13 12 25 0

第一轮遍历比较:

解释表格:

  1. 比较38和13大小,13比38小,交换位置,得到表格第二行的结果
  2. 比较38和12的大小,12比38小,交换两数的位置,得到表格地三行的结果
  3. 比较38和25的大小,25比38小,交换两数的位置,得到表格第四行的结果
  4. 比较38和0的大小,0比38小,交换两数的位置,得到表格最后一行的结果
第二轮遍历比较:

由于第一轮的遍历中,我们可以发现,38和所有的数字都进行了直接的比较,因此沉淀到最后的38 是最大的数字,在第二轮遍历比较中可以不用进行比较,减少循环次数。

在第二轮比较中,得出的较大数字为25,飘到了后边,此时25与其他数字进行了直接或间接的比较。

第三轮遍历比较:

分析方法同前两种,标红部分是已参与比较出来的较大数字,因此不用参与此次比较

第四轮遍历比较:

标红部分是已参与比较出来的较大数字,因此不用参与此次比较

经过四轮比较,可以得出最终排完序的结果:0,12,13 ,25, 38。

总结规律

  • 第一层循环:给出了5个数字比较,进行了四次遍历就得出了结果假设给出n个数字比较,则将会进行n-1遍历得出结果。
  • 第二层循环:在每一次遍历的时候,会进行两两比较,每一次遍历比较的次数也不同 

表格中遍历代表第i次遍历,比较代表每次遍历中两两比较的次数

第一列遍历是遍历次数从0开始计数,得出规律:假设有n个数字比较,会进行n-1次遍历,每次遍历会有n-i-1次比较。

代码

#include<stdio.h>
#include<stdlib.h>
#define N 1000
int main()
{
    int i,j,n,a[N],temp;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
  
   for(i=0;i<(n-1);i++)
   {
       for(j=0;j<(n-i-1);j++)
       {
           if(a[j]>a[j+1])
           {
               temp=a[j+1];
               a[j+1]=a[j];
               a[j]=temp;
        }
    }
   }
   for(i=0;i<n;i++)
   {
       printf("%d ",a[i]);
   }       
   printf("\n");
   return 0;
}

小提示:本代码涉及到了数组的输出与输入,如果大家看不懂的话,可以留言,我先给大家简单解释,后续会出一个数组集合,集中分析数组

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值