在排序算法中冒泡排序是最直观也是算易懂的; 从设计思路、代码实现Demo、算法分析。
思路:
- 挨个相邻的数据之间比较
- 前面数据大于后面数据则交换
- 有N个数据 需要通过N-1 次数据比较
Demo: 完整源码地址
/**
* @Title: 排序基本算法
* @Package ${package_name}
* @Description: 排序基本算法
* Created by eason_hoo on 16/8/7.
*/
public abstract class BaseSorter {
//构造sort函数
public abstract void sort(int[] array);
}
/**
* @Title: 冒泡排序算法
* @Package ${package_name}
* @Description: 冒泡排序算法 有N个数据需要N-1次中间比较排序 执行的步骤长 效率不高
* Created by eason_hoo on 16/9/4.
*/
public class BubbleSorter extends BaseSorter {
@Override
public void sort(int[] array) {
int temp; // 交换使用临时表
for (int i = 0; i < array.length;i++){
for (int j = i + 1; j < array.length;j++){
//从小到大排序,需要移位
if(array[i] > array[j] ){
temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
}
}
算法分析:
最好情况:数据有序
循环1次 比较N-1次 交换数据0次
最坏情况:数据逆序
循环N-1次 第1次循环:比较n-1次,交换n-1次,移动3(n-1)次; 第2次循环:比较n-2次,交换n-2次,移动3(n-2)次; …… 第n-2次循环:比较2次,交换2次,移动3*2次; 第n-1次循环:比较1次,交换1次,移动3*1次; 比较次数为:1+2+……+(n-1) = n(n-1)/2 移动次数为:3(1+2+……+(n-1)) = 3n(n-1)/2 所以时间复杂度:O(n2)
空间复杂度
冒泡排序只使用一个temp 所以空间复杂度为O(1)
运行稳定性
数组内数据整体不变 :排序稳定