C语言 冒泡排序 Bubble Sort

算法描述:有数组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大,否,则不移动,第四个位置被占领

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

代码清单:

1#include <iostream> 2 3void bubbleSort(int *array, int len) 4{ 5 int i, j; 6 for (i = 0; i < len - 1; i++) 7 { 8 for (j = 0; j < len - i - 1; j++) 9 { 10 if (array[j] > array[j + 1]) 11 { 12 int temp = array[j]; 13 array[j] = array[j + 1]; 14 array[j + 1] = temp; 15 } 16 } 17 } 18} 19 20int main() 21{ 22 int array[] = {1, 7, 9, 2, 0}; 23 printf("array before bubble sort="); 24 int i; 25 for (i = 0; i < sizeof(array)/sizeof(array[0]); i++) 26 { 27 printf("%d ", array[i]); 28 } 29 printf("\n"); 30 bubbleSort(array, sizeof(array)); 31 printf("array after bubble sort="); 32 for (i = 0; i < sizeof(array)/sizeof(array[0]); i++) 33 { 34 printf("%d ", array[i]); 35 } 36 return 0; 37}
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang