C语言之冒泡排序

1.什么是冒泡排序

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

2.个人对冒泡排序的理解

我们在读书的时候升国旗的的时候,每个班按一列从矮到高进行排队,敢开始没有调整队形的时候高矮参差不齐,因为老师站在队伍的前方,所以大家都想往后面站,后面可以干些小动作,假设有5个同学,A:183CM,B:188CM,C:175CM,D:166CM,E:168CM,最开始按ABCDE的位置站着的,刚开始A发现B比他高,打不过他,老老实实先站在第一个位置,B往后面看,发现C没他高,于是跟C换了个位置,C也没办法,谁叫人家比他高打不过呢。B换了位置后继续往后看发现D也没他高,让D到前面去,然后跟E比发现E也没他高让E又到他前面去,这是B往后面看发现没人了,就站在最后的位置玩起了手机。这时A很不爽,往后面看了看发现C比自己矮,于是跟C换了个位置,换了之后又跟D比,发现D也比他矮,又跟D换了个位置,在跟E比了一下发现E比他也要矮,就跟E也换了个位置,再往后看发现是A,吓一跳,不敢跟A比了,怕挨打,于是老老实实站个倒二的位置就知足了。然后C往后看跟D比了比发现比D要高,于是跟D换了个位置,然后继续跟E比发现比E高继续和E交换位置,往后看了看是A,不敢比了,怕挨打,于是只能站在第三个位置了。这时D特别不爽为什么他要站第一个位置于是跟E比了比身高,发现比他高,被E打了一顿,开始老实了,就站在第一个位置了。E往后看发现是C,之前比过的怕被打于是就不比了,大家都老老实实站好了,老师也高兴了,怎么现在的学生都这么听话,都还没说排队就站好了。

总的来说整个流程如下:183 188 175 166 168 

                                        第一轮:

                                        183 188 175 166 168 //183和188比较不交换位置

                                        183 175 188 166 168//188 和175比较交换位置

                                        183 175 166 188 168//188 和166比较交换位置

                                        183 175 166 168 188 //188 和168比较交换位置

                                        第二轮:

                                        175 183 166 168 188 //183 和175比较交换位置

                                        175 166 183  168 188//183 和166比较交换位置

                                        175 166 168 183 188//183 和168比较交换位置

                                          第三轮:

                                          166 175 168 183 188//166 和175比较交换位置 

                                           166 168 175 183 188//175 和168比较交换位置 

                                          第四轮 :

                                           166 168 175 183 188//166 和168比较不交换位置   

这样就实现了我们的冒泡排序。

冒泡排序代码实现:假设我们有n个元素冒泡排序比较相邻的两个元素,依次两两比较,第一轮比较n-1次我们就将最大的元素放到最后面了,于是第二轮比较我们就不用比较最后一个元素了,第二轮比较n-2次将剩余的元素中的最大的元素放在倒数第二个位置...依次类推第i轮比较n-i次我们就将剩余元素中的最大的元素放在了倒数第i个位置。这样就实现了我们的冒泡排序,但是如果如果中间就已经有序了,我们继续进行遍历增大了时间复杂度。如果一轮中没有交换,那么我们就退出不继续遍历了。于是这里设置了一个标志位flag,如果flag为0说明没有交换,那么直接退出循环,如果flag为1则继续执行循环。

               代码如下:

#include <stdio.h>

void bubble_sort(int arr[], int len) //冒泡排序算法
{
        int i, j, temp,flag=0;
        for (i = 0; i < len - 1; i++) //循环的轮数
        {
                flag =0;//每遍历完一轮初始化标志位标志位
                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;
                                flag =1;//发生交换将标志位置1
                        }
                }
                if(flag == 0) break;//如果一轮中都没有数据交换则退出循环
        }
}
int main()
{
        int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };//定义数组
        int len = (int) sizeof(arr) / sizeof(*arr);//数组长度
        bubble_sort(arr, len);//进行冒泡排序
        int i;
        for (i = 0; i < len; i++)//打印排序后的数组
        printf("%d ", arr[i]);
        printf("\n");
        return 0;
}

              效果截图

                                                                                                           

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值