![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190622173009.png)
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190622173453.png)
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190622173742.png)
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190622173824.png)
源码:
~~~ java
public class Bubble {
public static void main(String[] args) {
int[] a = {5, 4, 2, 6, 8, 1, 9, 7, 3, 10, 0};
// bubble1(a);
// bubble2(a);
// bubble3(a);
// bubble4(a);
for (int i : a) {
System.out.print(" " + i);
}
}
/**
* 最普通的冒泡排序,每次交换两个位置,最后一次只用换一个比较前两位
*
* @param a
*/
private static void bubble1(int[] a) {
if (null == a || a.length <= 1) return;
int len = a.length;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len - i - 1; j++) {
if (a[j] < a[j + 1]) {
a[j] = a[j] ^ a[j + 1];
a[j + 1] = a[j] ^ a[j + 1];
a[j] = a[j] ^ a[j + 1];
}
}
}
}
/**
* 使用是否发生交换位置优化
* 设置一个标志,如果这一趟发生了交换,则为true,
* 否则为false,如果有一趟没有发生交换,说明排序已经完成。
*
* @param a
*/
private static void bubble2(int[] a) {
if (null == a || a.length <= 1) return;
int len = a.length;// 每次排序的边界值
boolean isSort = true;//是否发生交换,没交换排序完成
while (isSort) {
isSort = false;//每次默认为不交换
for (int j = 0; j < len - 1; j++) {
if (a[j] > a[j + 1]) {
a[j] = a[j] ^ a[j + 1];
a[j + 1] = a[j] ^ a[j + 1];
a[j] = a[j] ^ a[j + 1];
isSort = true;//交换表明排序未完成
}
}
len--;//默认每次换一个值,总边界值减 1
}
}
/**
* 根据边界值优化
* 找到一次循环的最后边界,然后记录下来,作为下次循环的终点
*
* @param a
*/
private static void bubble3(int[] a) {
if (null == a || a.length <= 1) return;
int flag = a.length;//总长度,初始循环边界值,后面记录最后交换坐标
int len;// 每次循环的边界值
while (flag > 0) {
len = flag;// 每次更新边界值
flag = 0;// 坐标重置,默认排序完成,如果未完成在下面更改
for (int j = 0; j < len - 1; j++) {
if (a[j] > a[j + 1]) {
a[j] = a[j] ^ a[j + 1];
a[j + 1] = a[j] ^ a[j + 1];
a[j] = a[j] ^ a[j + 1];
flag = j + 1;
}
}
}
}
/**
* 使用是否发生交换位置 & 记录边界位置 优化
* 即综合 bubble3 和 bubble4
*
* @param a
*/
private static void bubble4(int[] a) {
if (null == a || a.length <= 1) return;
int len = a.length;// 外循环长度
int lastChange = 0;// 最后交换的点
int innerLen = len - 1;// 内循环的边界值
boolean isSorted;// 是否已经有序
for (int i = 0; i < len; i++) {
isSorted = true;// 每次默认是有序的,内循环无值交换,即退出
for (int j = 0; j < innerLen; j++) {
if (a[j] < a[j + 1]) {
a[j] = a[j] ^ a[j + 1];
a[j + 1] = a[j] ^ a[j + 1];
a[j] = a[j] ^ a[j + 1];
lastChange = j + 1;// 记录最后移动位置
isSorted = false;// 当前循环发生交换,最起码本次为无序,继续循环看下次是否发生交换
}
}
innerLen = lastChange;// 更新内循环边界值
// 如果有序,也就是本次内循环没发生位置互换,直接退出循环,排序完成
if (isSorted) {
break;
}
}
}
}
~~~
- Java 面试题
- String、StringBuffer、StringBuilder 的区别?
- Java 中的四种引用
- 接口和抽象类的本质区别
- 集合框架
- 集合概述
- ArrayList 源码分析
- LinkedList 源码分析
- HashMap 源码分析
- LinkedHashMap 源码分析
- Android提供的 LruCache 的分析
- LinkedList 和 ArrayList 的区别
- 多线程
- 实现多线程的几种方式
- 线程的几种状态
- Thread 的 start() 和 run() 的区别
- sleep() 、yield() 和 wait() 的区别 ?
- notify() 和 notifyAll() 的区别?
- 保证线程安全的方式有哪几种?
- Synchronized 关键字
- volatile 和 synchronized 的区别?
- 如何正确的终止一个线程?
- ThreadLocal 原理分析
- 线程池
- 多线程的三个特征
- 五种线程池,四种拒绝策略,三种阻塞队列
- 给定三个线程如何顺序执行完以后在主线程拿到执行结果
- Java 内存模型
- 判定可回收对象算法
- equals 与 == 操作符
- 类加载机制
- 类加载简单例子
- 算法
- 时间、空间复杂度
- 冒泡排序
- 快速排序
- 链表反转
- IO
- 泛型
- Kolin 面试题
- Android 面试题
- Handler 线程间通信
- Message、MessageQueue、Looper、Handler 的对象关系
- Handler 使用
- Handler 源码分析
- HandlerThread
- AsyncTask
- IntentService
- 三方框架
- Rxjava
- rxjava 操作符有哪些
- 如何解决 RxJava 内存泄漏
- Rxjava 线程切换原理
- map和 flatmap 的区别
- Databinding引起的 java方法大于 65535 的问题
- Glide
- Glide 的缓存原理
- Glide 是如何和生命周期绑定的?不同的Context 有什么区别?
- Glide 、Picasso 、的区别,优劣势,如何选择?
- Jetpack
- 源码分析
- EventBus
- EventBus 源码分析
- RxBus 替代 EventBus
- OkHttp
- OkHttp 源码分析
- OkHttp 缓存分析
- RxPermission
- RxPermission 源码分析
- Retrofit
- create
- Retrofit 源码分析
- 优化
- 启动优化
- 布局优化
- 绘制优化
- 内存优化
- 屏幕适配
- 组件
- Activity
- Frgment
- Service
- ContentProvider
- BroadcastReceiver
- 进程间通信
- Binder机制和AIDL
- AILD 中的接口和普通的接口有什么区别
- in、out、inout 的区别
- Binder 为什么只需要拷贝一次
- 在android中,请简述jni的调用过程
- 生命周期
- Activity 生命周期
- Fragment 生命周期
- Service 生命周期
- onSaveInstanceState() 与 onRestoreIntanceState()
- 前沿技术
- 组件化
- 模块化
- 插件化
- 热更新
- UI - View
- Android 动画
- 事件分发机制
- WebView
- 系统相关
- 谈谈对 Context 的理解
- Android 版本
- App应用启动流程
- App 的打包
- App 的加固
- App 的安装
- Activity 启动流程
- ClassLoader
- Lru 算法加载 Bitmap 三级缓存原理
- Parcelable 和 Serializable 的区别
- Activity的启动流程
- 相关概念
- 网络相关
- Http
- Https
- Http 和 Https 的区别
- 为什么要进行三次握手和四次挥手?
- OkHttp使用Https访问服务器时信任所有证书
- 设计模式
- 单例模式
- 构建者模式
- 工厂模式
- 外观模式
- 代理模式