冒泡排序详解(从小到大)
2016-07-21 10:52
281 查看
冒泡排序详解
算法思路
示例讲解
算法复杂度
时间复杂度
代码实现
然后再将第二个元素和第三个元素比较数值大小,第三个元素和第四个元素比较…依次不断地比较,交换。
不断循环比较,直到不再发生交换,这就表明排序已完成,此时得到就是一个有序数列。
简单来说就是不断循环比较数列中相邻元素的数值大小,根据数组大小关系通过交换位置来调整元素中的位置,直到数列中所有的元素位置不再发生改变。
第一趟(第一次循环):
第二趟(第二次循环):
第三趟(第三次循环):
最好情况:要排序的列表已经排好顺序的情况下,此时只需对列表扫描一次,算法复杂度为O(n)
算法思路
示例讲解
算法复杂度
时间复杂度
代码实现
冒泡排序详解
算法思路
将数列中的第一个元素和第二个元素比较数值大小,若第一个元素比第二个元素大,则交换位置。然后再将第二个元素和第三个元素比较数值大小,第三个元素和第四个元素比较…依次不断地比较,交换。
不断循环比较,直到不再发生交换,这就表明排序已完成,此时得到就是一个有序数列。
简单来说就是不断循环比较数列中相邻元素的数值大小,根据数组大小关系通过交换位置来调整元素中的位置,直到数列中所有的元素位置不再发生改变。
示例讲解
例如:对一个含有4个元素的数列:6,4,9,5 进行从小到大排序第一趟(第一次循环):
初态 | i=0 | i=1 | i=2 |
---|---|---|---|
6 | 4 | 4 | 4 |
4 | 6 | 6 | 6 |
9 | 9 | 9 | 5 |
5 | 5 | 5 | 9 |
1. i=0 第一次先将最前面的两个数6和4比较,6比4大,因此将4和6的位置交换 6,4,9,5 --> 4,6,9,5 2. i=1 第二次再将中间两个数6和9比较,6比9小,无需交换位置。 4,6,9,5 --> 4,6.9,5 3. i=2 第三次再将后面两个数9和5比较,9比5大,因此将9和5的位置交换 4,6,9,5 --> 4,6,5,9
第二趟(第二次循环):
初态 | i=0 | i=1 | i=2 |
---|---|---|---|
4 | 4 | 4 | 4 |
6 | 6 | 5 | 5 |
5 | 5 | 6 | 6 |
9 | 9 | 9 | 9 |
1. i=0 第一次先将最前面的两个数4和6比较,4比6小,无需交换位置 4,6,5,9 --> 4,6,5,9 2. i=1 第二次再将中间两个数6和5比较,6比5大,因此将6和5的位置交换 4,6,5,9 --> 4,5,6,9 3. i=2 第三次再将后面两个数6和9比较,6比9小,无需交换位置 4,5,6,9 --> 4,5,6,9
第三趟(第三次循环):
初态 | i=0 | i=1 | i=2 |
---|---|---|---|
4 | 4 | 4 | 4 |
5 | 5 | 5 | 5 |
6 | 6 | 6 | 6 |
9 | 9 | 9 | 9 |
1. i=0 第一次先将最前面的两个数4和5比较,4比6小,无需交换位置 2. i=1 第二次先将中间的两个数5和6比较,4比6小,无需交换位置 3. i=2 第三次先将后面的两个数6和9比较,4比6小,无需交换位置 第三趟没有发生交换,表明排序已完成,此时得到就是一个有序数列。
算法复杂度
时间复杂度
最差情况:要排序的列表完全逆序的情况下,此时时间复杂度为O(n^2)最好情况:要排序的列表已经排好顺序的情况下,此时只需对列表扫描一次,算法复杂度为O(n)
代码实现
/* * @author skyward */ public class BubbleSort { public void bubbleSort(int[] numbers) { /** * true为有交换;false为无交换 * 若无交换则表明排序完成,退出循环。否则继续排序 */ boolean numbersSwitched; do { numbersSwitched = false; for (int i = 0; i < numbers.length - 1; i++) { if (numbers[i + 1] < numbers[i]) { int tmp = numbers[i + 1]; numbers[i + 1] = numbers[i]; numbers[i] = tmp; numbersSwitched = true; } } } while (numbersSwitched); } @Test public void testBubble() { final int[] numbers = {6, 4, 9, 5}; //预期结果 final int[] expected = {4, 5, 6, 9}; bubbleSort(numbers); assertArrayEquals(expected, numbers); } }
相关文章推荐
- 冒泡排序
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- C++实现对输入数字组进行排序
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解