常见算法之排序一【冒泡排序】
来源:互联网 发布:淘宝上被骗了怎么投诉 编辑:程序博客网 时间:2024/05/29 03:07
冒泡排序是我们编程刚入门基本都会接触的一个排序算法,以来它比较简洁,也比较形象。
它的思想就是,让每一个相邻的元素进行比较,假如他们不是按照升序或降序,则交换他们位置,重复这个操作,最大或最小的元素就像泡泡一样,升到了最上面,对剩下的元素重复这个操作,所有的元素就可以排好序了。
它的运作方式:
1.从头向后比较,假如相邻的元素之间的大小不是按升序或降序则将他们进行比较,若不是指定规则,则交换他们的位置
2.按照(1)的方式,依次对每一对进行比较,直至末尾
3.除了上述挑出的最大或最小元素外,重复以上的步奏,直到没有数字需要比较
所以我们可以看到,在不经仍任何优化的前提下,它需要比较的次数是o(n^2),需要o(n) + o(1)的空间
下面我们看看代码:
private static void swap(int[] array, int from, int to){ int temp; temp = array[from]; array[from] = array[to]; array[to] = temp; } public static void sort(int[] array){ for (int i = 0; i < array.length - 1; i++){ for (int j = 0; j < array.length - i - 1; j++){ if (array[j] > array[j+1]){ swap(array, j+1, j); } } } }我们说了,每次需要比较相邻的元素,假如,某一个不是最后一趟的遍历中,发现没有交换的,那么意味着我们的数组已经有序了,所以就没有必要继续进行后续操作。所以我们可以设置一个标志位,以检查是否还需要比较。
public static void sort(int[] array){ for (int i = 0; i < array.length - 1; i++){ boolean flag = true; for (int j = 0; j < array.length - i - 1; j++){ if (array[j] > array[j+1]) { swap(array, j + 1, j); flag = false; } } if (flag){ return; } } }但是,我们好像还能发现冒泡排序还有一个特点,冒泡排序后的数组,它的顶端必定是有序,当我们在一趟中最后一次交换元素的位置以上是有序的,而且是最大或最小的几个元素。所以在下一次遍历时,我们没必要在对他们进行比较,再结合上面的标志位,我们可以把它改成:
public static void sort(int[] array){ int exchange = array.length - 1 ; //最后一次交换的位置 while(exchange > 0) { int bound = exchange; //每次交换的最后位置 exchange = 0; for (int j = 0; j < bound; j++){ if (array[j] > array[j+1]) { swap(array, j + 1, j); exchange = j; } } } }
到这,我们总结一下:
冒泡排序,平均时间复杂度O(n^2),最差时间复杂度O(n^2),最优时间复杂度O(n),最差空间复杂度O(n) + O(1)
好了,假如你有更好的方法,欢迎留言讨论。
0 0
- 常见算法之排序一【冒泡排序】
- 常见排序算法之冒泡排序
- 常见排序算法之冒泡排序
- 常见排序算法(一)(冒泡排序、插入排序)
- 前端常见排序算法之冒泡算法
- 浅谈排序算法(一)之冒泡排序
- 排序算法一之冒泡排序
- 数据结构<一> 排序算法之冒泡排序
- 排序算法《一》冒泡排序
- 排序算法一 冒泡排序
- 排序算法一:冒泡排序
- 排序算法一:冒泡排序
- 排序算法一:冒泡排序
- 排序算法(一):冒泡排序
- 排序算法(一)-冒泡排序
- 一天一算法之冒泡排序
- 每日一算法之JS冒泡排序
- 排序算法之冒泡(一)
- 在cocos2dx2.2.3中遇到的error LNK2019: 无法解析的外部符号 _libiconv_closexxxxxxx的解决办法
- 小马哥---高仿S5机型 拆机主板MD809型号 芯片6572 详细拆机主板图与开机界面图
- win2003彻底禁止windows自带防火墙及删除其相关文件的方法
- 微信jssdk接口(php)
- Android Studio 1.01 使用 Git 总结及问题解决(需要在本地安装git )
- 常见算法之排序一【冒泡排序】
- 如何解决PHP连接MySQL时出现的Access denied for user 'root' @ 'localhost'(using password :YES)
- Win8Metro(C#)数字图像处理--2.29图像除法运算
- android 4.0 以上平台选择图片报错Attempted to access a cursor after it has been closed.
- Linux 下zip包的压缩与解压
- 关于typedef的用法总结
- win8系统使用MyEclipse的复制一行代码ctrl+alt+方向键,解决方案
- 开源3D游戏引擎Irrlicht简介
- 用c语言多文件编写1000人的通讯录