冒泡排序是一种稳定排序,时间复杂度平均为O(n^2),最好的时间复杂度为O(n),最坏为O(n^2)。

排序时每次只比较当前元素与后一个 元素的大小,如果当前元素大于后一个元素,则交换,如此循环直到队尾,每轮排序都可以保证将当前排序下最大的元素送到未排序部分的队尾。

有n个元素要排列,故要执行n次数组的整体大排列。

每次大排列中都要比较当前元素与后一个元素的大小,每轮要比较n-1次,但是因为之前的每一轮都将一个元素放置到了正确的位置,所以无需比较,若设之前累计循环了i次,将i个元素正确地放置在了数组的末尾,所以每轮大排列只需要比较n-1-i次。

代码如下

冒泡排序:

#include <stdio.h>

void bubblingSort(int arr[], int n) {
int i, j, temp;
// 每次将一个元素送到末尾,n个元素,执行n次
for (i = ; i < n; ++i) {
// 之前的循环已经将i个元素送到末尾,不需要再次比较,故减去,因为跟后一个元素比较,为了避免溢出,故减一
for (j = ; j < n - i - ; ++j) {
// 如果当前的元素比后一个元素小,就交换
if (arr[j] > arr[j + ]) {
temp = arr[j];
arr[j] = arr[j + ];
arr[j + ] = temp;
}
}
}
} int main() {
int i;
int arr[] = {, , , , , , , , , };
bubblingSort(arr, );
for (i = ; i < ; ++i) {
printf("%d ", arr[i]);
}
return ;
}

从前面的图可以看出,冒泡排序在后几轮实际上已经排好序了,但还是在循环校验。当每次大排列时如果没有一个元素发生交换,数组就已经排好序了,可以终止循环。我们修改一下代码,加上判定元素交换的标志。

优化后的冒泡排序:

#include <stdio.h>

void bubblingSort(int arr[], int n) {
int i, j, temp;
int flag = ; // flag用来校验每轮循环有没有移动元素,0为没有移动,1为移动
// 每次将一个元素送到末尾,n个元素,执行n次
for (i = ; i < n; ++i) {
flag = ;
// 之前的循环已经将i个元素送到末尾,不需要再次比较,故减去,因为跟后一个元素比较,为了避免溢出,故减一
for (j = ; j < n - i - ; ++j) {
// 如果当前的元素比后一个元素小,就交换
if (arr[j] > arr[j + ]) {
flag = ; // 有数据交换
temp = arr[j];
arr[j] = arr[j + ];
arr[j + ] = temp;
}
}
// 没有数据交换,提前结束
if (flag == ) {
break;
}
}
} int main() {
int i;
int arr[] = {, , , , , , , , , };
bubblingSort(arr, );
for (i = ; i < ; ++i) {
printf("%d ", arr[i]);
}
return ;
}

冒泡排序,C语言实现的更多相关文章

  1. 冒泡排序_C语言_数组

    冒泡排序_C语言_数组 #include <stdio.h> //冒泡排序 小->大 void sort(int * pArray, int len); int main(int a ...

  2. 算法之冒泡排序(Java语言)

    冒泡排序(英语:Bubble Sort) 是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说 ...

  3. 数据结构算法之冒泡排序——Java语言实现

    今天来谈下冒泡排序算法,这次实现由两种形式如下所示: 1.对于长度为N的数据序列,没有加标签限制,针对一开始就是有序的数据序列,仍然需要排序N-1趟来完成排序. 2.对于长度为N的数据序列,加标了签限 ...

  4. 冒泡排序java语言实现

    class bubbleSort { public static void main(String[] args){ int[] a={49,38,65,97,76,13,27,49,78,34,12 ...

  5. 排序(3)---------冒泡排序(C语言实现)

    说到冒泡排序,大一的时候第一次学习这个排序算法,可能大家不知道,"冒泡"在我说的方言里面是吹牛逼的意思. 所以就认为这个排序算法特吹牛逼有木有. 相信大家对全部的排序算法,这个想必 ...

  6. C:冒泡排序

    冒泡排序 C语言在运行的时候,不会帮我们检查数组的下标. 冒泡排序:有n个数字,需要进行 n - 1 趟比较大小(元素的个数减去 1).外层循环 for( int i = 0; i < coun ...

  7. 冒泡排序快速版(C)

    冒泡排序C语言版:在每轮排序中检查时候有元素位置交换,如果无交换,说明数组元素已经有序,无需继续排序 #include <stdio.h> #include <stdlib.h> ...

  8. 冒泡排序(表格说明)(js)

    冒泡排序我自己的理解是(假设从大到小): 比较每一对相邻元素的值,如果前面的元素小于后面的元素那么就将它们交换过来,每次排序的比较次数逐次递减,最后的比较次数为1.总的排序轮数为数组长度减1.为了便于 ...

  9. python算法与数据结构-冒泡排序算法(32)

    一.冒泡排序介绍 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要 ...

  10. 2019年春季学期《C语言程序设计II》课程总结

    2019年春季学期<C语言程序设计II>课程总结 1.课程情况 教学内容 课堂小结 作业安排 优秀作业 备注 1.开学谈心 2.测验数据类型.运算符与表达式的自学情况,并讲解测验题目3.第 ...

随机推荐

  1. [翻译] HTKDragAndDropCollectionViewLayout

    HTKDragAndDropCollectionViewLayout Custom UICollectionViewLayout that works together with a custom U ...

  2. cocos2dx加载骨骼动画,获取骨骼位置

    2015/05/13 需求: (1)希望在骨骼上绑定一个粒子特效 (2)获取骨骼的位置 (3)获取骨骼动画的大小 (4)lua 1. cocostudio动画编辑器 (1)绑定粒子特效(跟随骨骼的移动 ...

  3. Python super执行基类的构造方法

    有一个需求是这样的,先有一个Machine的类,有通用的name.position.date属性,然后又出现了一个Server的类继承Machine类,但是Server类多出一个ipaddr的属性,所 ...

  4. VC listBox控件的方法

    获取listBox里所有行数 GetCount(); 设置某行的选中状态 SetSel(index,true);第一个参数是行号,第二个参数是否选中

  5. contextlib

    contextlib with 语句   上下文 任何对象,只要正确实现了上下文管理,就可以用于with语句. 实现上下文管理是通过__enter__和__exit__这两个方法实现的. 例如,下面的 ...

  6. php使用<?php include之后页首有空白

    1.今天做这一个页面的时候发现如果使用<?php include包含了一个页面,但是页首始终有一个空白行,度娘出来原来是因为使用了UTF-8格式,应该选择UFT-8无BOM格式的,原来还有这一说 ...

  7. source insight设置问题 [问题点数:20分,结帖人leecapacity]

    http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104687270e54f7327d818c027fa3cf1fd5791d1c05 ...

  8. 四种Timer的区别和用法

    1.System.Threading.Timer 线程计时器 1.最底层.轻量级的计时器.基于线程池实现的,工作在辅助线程. 2.它并不是内在线程安全的,并且使用起来比其他计时器更麻烦.此计时器通常不 ...

  9. 导出当前域内所有用户hash的技术整理

    0x00目标: 导出当前域内所有用户的hash 0x01测试环境: 域控:server2008 r2 杀毒软件:已安装* 域控权限:可使用net use远程登陆,不使用3389 0x02测试方法: ( ...

  10. [零基础学JAVA]Java SE面向对象部分.面向对象基础(05)

    1.继承 2.多态 3.final 4.重载与覆写 5. this/super 6.抽象类 7.接口 java: class Person{ private String name;    priva ...