C语言冒泡排序

(图中给出的数据全是建立在数组的基础上的!!!)

在说冒泡排序前,咱们需要知道冒泡的两个特点:

1、排序是按照升序去排的(从大到小排列的)。

2、从第一个元素开始和相邻的两个元素进行的比较的。(咱直接上图)

 从图中我们可以看到这组数据中最大的数字9经过九次相邻的比较排到了最后的位置(这样的结果我们称为一趟完整的冒泡);至此我们可以发现一个问题,那就是一轮冒泡我们将数字放到了对应的位置。(那我们就可以认为是一趟就可以排序好一个元素

对此我们可以使用一个for循环来控制趟数

int l=0;(元素个数)
int n=0;
for(n=0;n<l-1;n++)
{
    
}

对于第一层for中的循环条件“l-1”,我们是这样理解的:那就是我们假设有3个数字要进行从小到大的比较排列,那我们就是需要比较两次就可以得到这三个数的排序,那这两次的次数是3-1得到的2;所以当我们有l个数字的时候那我们不就是得到次数是l-1啦。

现在咱们再看一张图:

可以看出这张图片,我们第二趟把第二大的数字放到倒数第二的位置 ,这也验证了咱们前面的结论:一趟就可以排序好一个元素!对此我们还可以发现一个规律那就是比较的次数是有如下的规律的:

趟数+1,比较次数-1

对此我们就可以用一个for循环控制比较的次数

int a=0;
for(a=0;a<-1-n;a++)
{
    
}

对于a<l-1-n,(l是一组数据的元素的总数,n是控制趟数的变量,下面会给出完整的代码!)我们可以代一个数试一下这个条件,假设是将9 8 7 6 5 4 3 2 1 0 这一组数中的9完成一次排序,那么它的比较次数就是a<10-1-1,那么a<8就是比较了九次。

最后就是给出我们的冒泡的结构啦:

int temp=0;
if(a1>a2)
{
    a1=temp;
    a1=a2;
    a2=temp;
}

对于判断条件:a1>a2,根据冒泡的特点是升序,因此要是a1<a2我们就没必要排序了,因为它就是一个升序的状态,所以只有当a1>a2时我们才要改变他们的位置。

那我们最后理解上面的逻辑就可以写出一下的代码了:

#include<stdio.h>
int main()
{
    int arr[]={9,8,7,6,5,4,3,2,1};
    int len=sizeof(arr)/sizeof(arr[0]);//这里的len就是算出元素的总个数。
    int n=0;
    for(n=0;n<len-1;n++)//第一层控制趟数
    {
         int i=0;
        for(i=0;i<len-1-n;i++)//控制比较的次数
        {    
             int temp=0;
            if(arr[i]>arr[i+1])
            {
                temp=arr[i];
                arr[i]=arr[i+1]
                arr[i+1]=temp;
            }
        }
    }
    int a=0;
    for(a=0;a<len;a++)
    {
        printf("%d ",arr[a]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值