C语言 冒泡排序 Bubble Sort

Stella981
• 阅读 481

算法描述:有数组array,其长度为len。第一轮工作从末尾开始往前比较工作。如果末尾数据比他前一位数据大,则交换他们的位置,否则则不交换。无论本次比较的结果是交还是不交换,这两个数据都遵循了前一个数据比后一个数据大的结果。接下里向前移动一个工作位置,重复以上的操作。这样一轮比较结束。大的数据不断往前移动。如果他是最大的,就会一直往前移动。如果不是则说明数组前面中还有比他大的数据,该数据也尝试向前交换移动直到结束或者也遇到有更大的数据。一轮结束以后,本轮中最大的数据就到了最前面。这个数据就占领这个位置了。下一轮我们的工作位置又回到最后一位,由于第一个位置已经被占领了,所以这个位置我们就排除在本轮工作的范围内。以此类推,直到工作区间最后长度只剩下2个数据为止。

例子演示:

数组:4 3 2 5 1,长度:5

第一轮:

  • 4 3 2 5 1→4 3 2 5 1 比较最后一位1是否比前一位5大,否,则不移动
  • 4 3 2 5 1→4 3 5 2 1 移动工作位置到前一位,比较5是否比2大,是,交换
  • 4 3 5 2 1→4 5 3 2 1 移动工作位置到前一位,比较5是否比3大,是,交换
  • 4 5 3 2 1→5 4 3 2 1 移动工作位置到前一位,比较5是否比4大,是,交换,第一个位置被占领

第二轮

  • 5 4 3 2 1→5 4 3 2 1 比较最后一位1是否比前一位2大,否,则不移动
  • 5 4 3 2 1→5 4 3 2 1 移动工作位置到前一位,比较2是否比前一位3大,否,则不移动
  • 5 4 3 2 1→5 4 3 2 1 移动工作位置到前一位,比较3是否比前一位4大,否,则不移动,第二个位置被占领

第三轮:

  • 5 4 3 2 1→5 4 3 2 1 比较最后一位1是否比前一位2大,否,则不移动
  • 5 4 3 2 1→5 4 3 2 1 移动工作位置到前一位,比较2是否比前一位3大,否,则不移动,第三个位置被占领

第四轮:

  • 5 4 3 2 1→5 4 3 2 1 比较最后一位1是否比前一位2大,否,则不移动,第四个位置被占领

总结:冒泡算法优点:简单,实现容易,运算稳定,穷举即可。缺点:存在浪费现象,比如以上这个例子,在这个数组中第一轮结束数组其实已经排完顺序了。后面还要继续计算。可以改良,但是即使改良还是存在不必要的运算。

代码清单:

#include <iostream>

void bubbleSort(int *array, int len)
{
    int i, j;
    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - i - 1; j++)
        {
            if (array[j] > array[j + 1])
            {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

int main()
{
    int array[] = {1, 7, 9, 2, 0};
    printf("array before bubble sort=");
    int i;
    for (i = 0; i < sizeof(array)/sizeof(array[0]); i++)
    {
        printf("%d ", array[i]);
    }
    printf("\n");
    bubbleSort(array, sizeof(array));
    printf("array after  bubble sort=");
    for (i = 0; i < sizeof(array)/sizeof(array[0]); i++)
    {
        printf("%d ", array[i]);
    }
    return 0;
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
2年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这