c语言---冒泡排序(循环及数组的应用)

冒泡排列的作用

冒泡排序的作用就是把一串无序排列的数字转化为有序排列的数字!

冒泡排序原理

我们先来讲解一下冒泡排序的原理

先请不了解冒泡排序的同学花几分钟时间看下这张动图:
在这里插入图片描述
上图就是接下来我要讲解的升序
升序:就是按照从左到右依次增大的顺序对一组无序数列进行有序排列。

例如下面五个无序排列的数字:

12   -23    15    4    7

如果要将这五个数字按照升序有序排列
那先要进行的是将相邻的的数字依次两两比较

第一轮比较:
12 > -23

则12 、-23互换位置
得到如下顺序:

-23  12  15  4  7

继续比较

12 < 15

此步较大的数15本来就在高位上,则数字位置不变,
继续比较,比较 上一步中较大的数

15 > 4

则有

-23  12  4  15  7

继续比较

15>7

变成

-23  12  4  7  15

这时我们发现这组无序数字中最大的数15,到达最右边的位置,即到达最高位

第二轮比较:
-23 < 12    //位置不变
12 > 4

变为

-23  4  12  7  15

继续比较

12 > 7   
变为:
-23  4  7  12  15

可以发现,此时得到一组为升序的有序数列,不需要继续比较,否则继续进行下一轮比较
以上就是冒泡序列的进程原理,可以试着通过原理将代码打出来

大家可以发现它的原理只是重复执行一个命令(就是不断比较大小,互换位置)
我们接下来用代码来运行一下

#include <stdio.h>
int main(int argc, const char * argv[])
{
    int a[] = {12,-23,15,4,7};
    int n;  //存放数组a中元素的个数
    int i;  //比较的轮数
    int j; //每轮比较的次数
    int buf;   //交换数据时用于存放中间数据
    n =sizeof(a[n]);  /*sizeof即输出后面数组a[n]的容量(数字个数)*/
    for (i=0; i<=n-1; ++i)  //两两进行比较,需要比较n-1轮
    {
        for (j=0; j<n-i; ++j)  /*每轮比较n-i次,意为每次排序后不用去管已经排完的数了,就是n-i*/
        {
            if (a[j] > a[j+1])   //如果数组中第j项大于第j+1项,进行if运算
            {
                buf = a[j];    //将a[j]数列赋给buf
                a[j] = a[j+1];  //将a[j+1]数列赋给a[j]
                a[j+1] = buf;  //将buf赋给a[j+1]
            }
        }
    }
    for (i=0; i<=n; ++i)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}

运行结果如下:
在这里插入图片描述
可以看见成功运行,并按照升序排列

有的同学可能会对下面这段代码有些疑问

这里也正是完成置换的关键所在

if (a[j] > a[j+1])   //如果数组中第j项大于第j+1项,进行if运算
            {
                buf = a[j];    //将a[j]数列赋给buf
                a[j] = a[j+1];  //将a[j+1]数列赋给a[j]
                a[j+1] = buf;  //将buf赋给a[j+1]
            }

这段代码其实就是将数值交换位置的过程代码
我们来细讲一下:

if (a[j] > a[j+1])   

这个意思就是,如果第 j 个数大于第 j+1 个数
换个说法就是,如果第 j 个数大于它右边(升序中)那个数

{
	buf = a[j];    
	a[j] = a[j+1]; 
	a[j+1] = buf;
} 

上面这段代码意思就是将数组中的第 j 项存于 buf 中,而将第 j+1 项换到第 j 项上,再将 buf 置换到第j+1项,也就是数组中的第 j 项换到第j+1项上去。
以上就是大小值置换的过程!

1.大家也不妨试着改成降序的方式来排列这串无序数组,即从左到右依次减小的顺序
2.大家也可以将这个代码改为动态代码,比如说自己可以随便定义数组(就是在代码的原基础上增加 scanf )的值并求顺序,使这段固定的代码可以拥有计算器的功能

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值