冒泡排序法

冒泡排序法的原理就是把一组数据第一个元素跟第二个元素比较,若为逆序则交换位置,然后第二个元素跟第三个元素进行比较直至比较完所有的元素,从而实现从小到大或者从大到小排列起来的一个算法。

 冒泡排序流程图


表格法解析

比如说有四个数进行比较(从小到大):43 、12、66、19

                j   

  i

012
012、43、66、19(第一轮第一次,43跟12进行比较)12、43、66、19(第一轮第二次,43跟66进行比较)12、43、19、66(第一轮第三次,66跟19进行比较)
112、43、19(第二轮第一次,12跟43进行比较)12、19、43(第二轮第二次,43跟19进行比较)
212、19(第三轮第一次,12跟19进行比较)

第一轮

第一次第一个数跟第二个数进行比较,43比12大,所以43跟12交换位置;(第n个数都是进行比较过后得到的数,以下同)

第二次的时候第二个数跟第三个数进行比较,第一轮的时候43跟12交换了位置,所以第二个数是43,43比66小,不用交换位置;

第三次的时候,第三个数跟第四个数进行比较,66比19大,交换位置;

所以第一轮得出的最大的数是66

第二轮(抛开最大的数66进行比较)

第一次第一个数跟第二个数进行比较,12比43小,不用交换位置;

第二次第二个数跟第三个数进行比较,43比19大,进行交换;

所以第二轮得出的最大的数是43

第三轮(抛开第二个最大的数43进行比较)

 第一次第一个数跟第二个数进行比较,12比19小,不用交换位置

所以第三轮得到的最大的数就是19

可以看到我们进行了三轮比较,所以i<3 (3:len-1,len是整个数组的长度)


 代码

方法一:

#include<stdio.h>

    int main()
    {

        int i,j,temp;
        int arr[4]={43,12,66,19};
   
        for(i=0;i<4;i++){
            for(j=0;j<4;j++){
                    if(arr[j]>arr[j+1]){

                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                }
            }
        }
        printf("按从小到大排序:\n");
        for(i=0;i<4;i++){
            printf("%d ",arr[i]);
        }

        return 0;
    }

这是比较基本的代码,也可以根据需要进行修改。

以上代码运行结果如下:

 

方法二:

#include<stdio.h>

    int main()
    {

        int i,j,temp;
        int arr[]={43,12,66,19};
        int len=sizeof(arr)/sizeof(arr[0]);  //计算出数组的长度
        for(i=0;i<len-1;i++){
            for(j=0;j<len-1-i;j++){
                    if(arr[j]>arr[j+1]){

                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                }
            }
        }
        printf("按从小到大排序:\n");
        for(i=0;i<len;i++){
            printf("%d ",arr[i]);
        }

        return 0;
    }

运行结果也是一样的:

 这两个方法都是冒泡排序,只不过方法二在后续的修改中更加方便。

接下来简单讲一下方法二中的语句:

int arr[]={43,12,66,19};
int len=sizeof(arr)/sizeof(arr[0]);  //计算出数组的长度

第一句是定义一个数组arr[],他的特点就是[]里面是空的可以不用写数组的长度,那问题来了,数组的长度怎么计算呢?这就到了第二句了,第二句中sizeof就是用来计算大小的,我们可以用他来计算数组的长度。这样子的话,不管我们在数组里输入多少数字,都能进行排序。

我们来看一下运行效果:

 

那我们代码里实现的是从小到大对数组进行排序,那我们如果想要把数组进行从大到小进行排序的话,该如何进行修改呢?

 if(arr[j]>arr[j+1]){

                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                }

我们来看一下这段代码,就是第j个数和第j+1个进行比较,数值大的就排到后面,就可以实现从小到大进行排序。如果我们要进行从大到小进行排序,只需要把">"改成"<"就可以了。

接下来就让我们看一下运行效果吧:

 


好了,关于冒泡排序法就总结到这啦~拜拜 下次见。

  • 20
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值