冒泡算法的时间复杂度问题
来源:互联网 发布:制作拜年视频软件 编辑:程序博客网 时间:2024/05/18 01:30
最近在学习算法过程中发现了一个小问题,在这里和大家分享一下。
在许多地方看到冒泡排序的最佳时间复杂度为O(n),于是自己写了个冒泡排序如下:
<span style="font-size:18px;">public void bubbleSort(int[] a){ for(int i=1;i<a.length;i++){ for(int j=0;j<a.length-i;j++){ if(a[j]>a[j+1]){ int temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } }}</span>
看了半天自己的代码,即使是正序排列,就算第一趟排序没有交换,比较操作循环还是会继续,次数为n*(n-1)/2之,怎么会出现O(n)的复杂度呢?
后来在网上查了一下,原来是我的代码有问题,可以继续优化。如果按照我的思路,即使最好的情况复杂度还是O(n2),因为比较循环会一直进行下去直到循环结束。
优化方法应该设置一个中断标志位,在条件测试中如果发生了交换就将中断位屏蔽,然后在外层循环中检查中断位,如果中断位没有被屏蔽,将结束循环。每次开始内层循环之前重置中断位。这样就可以在已经是正序排列时不继续进行循环,达到最优的复杂度。优化代码如下:
<span style="font-size:18px;">public void bubbleSort(int[] a){ for(int i=1;i<a.length;i++){ boolean didSwap=false; for(int j=0;j<a.length-i;j++){ if(a[j]>a[j+1]){ int temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; didSwap=true; } } if(!didSwap) return; }}</span>
0 0
- 冒泡算法的时间复杂度问题
- 冒泡算法的时间复杂度为什么是O*2
- 冒泡排序的时间复杂度
- 递归算法时间复杂度的估计问题
- 算法的时间和空间复杂度问题
- 冒泡排序时间复杂度和算法
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- 算法的时间复杂度
- JAVA MVC 01
- poj1028_Web Navigation
- 编一个程序求质数的和
- 第十四周 项目三--多科成绩单(3.3)
- Shell脚本之awk
- 冒泡算法的时间复杂度问题
- effective c++条款10-12(operator=(重载返回类型、自我赋值和深层复制))整理
- 关于ftp用户连接时出现500 OOPS问题
- LDD3 中 awk 语句的解释
- <Java>Java数组的深拷贝与浅拷贝
- 软件工程3——第四章 迭代一总结及感想
- Spark - 大数据Big Data处理框架
- 基于pythonSimpleHTTPServer的d3js (bubble_cloud-gh-pages)
- MySQL图形工具 MySQL GUI Tools的安装使用方法