2-3 冒泡排序
来源:互联网 发布:淘宝企业店铺需要什么 编辑:程序博客网 时间:2024/05/23 15:33
冒泡排序的基本思想
1、相邻的两个元素进行比较,把比较大的元素排在后面,这样一轮循环下来,就可以找到这一轮循环中最大的那个元素,我们把这个过程形象地称之为“冒泡”。
2、由于每一轮循环都“冒泡”出一个这一轮循环最大的元素,所以上一轮循环的最后一个元素,不应该参加下一轮循环的比较了,这就是为什么内层循环的结束条件是 j < arr.length -i -1 的原因了。
代码实现:
public class BubbleSort implements ISortAlgorithm { @Override public String getName() { return "bubble sort"; } @Override public void sort(int[] arr) { int len = arr.length; for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); } } } } private void swap(int[] arr, int index1, int index2) { int temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; }}
关于代码的说明:
使用一个最极端的例子来理解冒泡排序
当待排序的数组如果是倒序排序的时候,这个“冒泡”的过程就显得非常“好看了”。
代码实现:
控制台打印:
我们应该认识到一点:冒泡排序是可以提前结束的
如果在一轮排序的过程中,没有元素“浮出水面”,那么我们可以认为这个数组就已经是排好序的了,因为下一轮甚至下下一轮循环仍然不会有元素“浮出水面”。
代码实现:
public class BubbleSortOptimize implements ISortAlgorithm { @Override public String getName() { return "optimize bubble sort"; } @Override public void sort(int[] arr) { int len = arr.length; for (int i = 0; i < len - 1; i++) { // 是否要进行下一轮循环,默认是要进行下一轮循环的 // 只有在这一轮循环中没有发生元素的交换,才不进行下一轮循环 boolean flag = true; for (int j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); flag = false; } } if (flag) { break; } } } private void swap(int[] arr, int index1, int index2) { int temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; }}
下面以排好序的数组为例进行测试:
/** * 两个版本的冒泡排序性能比较 */@Testpublic void testBubbleSortOptimizeCompare(){ int N = 10000; int[] sortedArray = new int[N]; for (int i = 0; i < N; i++) { sortedArray[i] = i; } int[] copyFromOldArray = SortTestHelper.copyFromOldArray(sortedArray); SortTestHelper.testSortEfficiency(new BubbleSort(),sortedArray); SortTestHelper.testSortEfficiency(new BubbleSortOptimize(),copyFromOldArray); SortTestHelper.testSorted(sortedArray); SortTestHelper.testSorted(copyFromOldArray);}
执行结果:
您所使用的排序算法是 => bubble sort
排序算法耗时 => 0.028 秒
您所使用的排序算法是 => optimize bubble sort
排序算法耗时 => 0 秒
给定数组按照升序排序!
给定数组按照升序排序!
阅读全文
0 0
- 2-3 冒泡排序
- 排序(3)冒泡排序
- 排序算法(2)-冒泡排序
- 【排序算法2】冒泡排序
- 数据结构-排序(2):冒泡排序
- 3种冒泡排序
- 3冒泡排序
- 3、冒泡排序BubbleSort()
- (3)冒泡排序
- 冒泡排序2
- 冒泡排序(2)
- 冒泡排序(2)
- 冒泡排序(2)
- 思考题 2-2 冒泡排序
- 2012/3/30----冒泡排序
- 冒泡排序 3种交换
- C++冒泡排序(3)
- 冒泡排序3中方法
- 2-2 插入排序(1)
- 2-2 插入排序(2)
- 每日英语阅读(五十六)
- 2-2 插入排序(3)
- Python 函数式编程(一)
- 2-3 冒泡排序
- 让你越来越值钱的秘密:目标清单
- NOIP模拟9.13
- Virus_JS3_PyAnalysisAndSummary
- [树形dp][trie]cf856B Similar Words
- Python函数式编程之lambda
- 知识点1
- 下载CentOS
- 前后端分离