冒泡排序
2016-07-01 16:24
260 查看
思想
它是经过一系列的交换动作。首先第一个元素和第二个元素比较,如果第一个大,则二者交换,否则不交换;然后第二个元素和第三个元素交换,若果第二个元素大,则交换,否则不交换……直到按照这种方式进行下去,最终最大的那个元素被交换到最后一个位置,一趟冒泡排序完成。下一趟排序同样上面的操作,但是只交换到倒数第二个位置,这个位置是第二大的元素。直到一趟排序中没有交换元素时候排序结束。这样每次把一个元素找到对应位置,大的上浮,小的下浮。步骤
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
例子
上面一个过程应该是一趟排序
动画
算法
package alg.sort; public class BubbleSort { public void sort(int[] A){ int n = A.length; boolean flag = true;; for(int i=n-1;i>=0;i--){ flag = true; for(int j=0;j<i;j++){ if(A[j]>A[j+1]){ int tmp = A[j]; A[j] = A[j+1]; A[j+1] = tmp; flag = false; } } if(flag) return; } } public static void main(String[] args){ int[] A = new int[]{49,38,65,97,76,13,27,49}; Print.printArray(A); BubbleSort bubbleSort = new BubbleSort(); bubbleSort.sort(A); Print.printArray(A); } }
复杂度分析
(1)时间复杂度最好情况:原始序列有序,不需要交换,时间复杂度O(n)O(n)
最坏情况:元素序列逆序,第i个元素回到排序位置应该交换i次,时间复杂度O(n2)O(n^2)
平均时间复杂度O(n2)O(n^2)
(2)空间复杂度
只用到常量的空间,空间复杂度O(1)O(1)
说明:
在一次排序后,可以使得最大元素回到排序后的位置
参考
1.《数据结构高分笔记》
2.链接
相关文章推荐
- QThread多线程编程经典案例分析
- Redis实践----安装部署篇
- Java之BufferedImage简谈
- [leetcode]222. Count Complete Tree Nodes
- Resources are low on NN. Please add or free up more resources then turn off safe mode manually.
- AsyncTask线程池使用
- lineCap属性
- 保护模式学习笔记:GDT
- python 中中文编码
- js 图片上传并预览
- tc添加视图Custom View
- Apache脚本路径别名(CGI接口)
- Apache配置日志功能
- STP 保护
- 最快速读取手机通讯录中联系人信息
- Linux 在一个命令行上执行多个命令
- Ping++ 支付接口对接
- docker常用命令
- 学习spark之基础环境搭建
- Android ORMLite 框架的入门用法