/*
* 冒泡排序:(稳定算法)
* 基本思想:冒泡排序属于比较简单的排序,以非递减为例,依次遍历数组,发现a[i]>a[i+1}的情况,swap(a[i],a[i+1])
* 直到没有逆序的数据,完成排序
* 可以用两个for循环嵌套实现,外层控制遍历次数,内层用来实现交换
*
* 也可以用一个boolean类型变量来控制是否有交换发生,如果没有交换,表明已经正序,可以直接输出
*
* 复杂度 分析:
* 很明显,冒泡排序最好情况是数组已经有序的情况,此时只需要遍历一次数据,没有交换发生,结束排序,时间复杂度为O(n)
* 那最坏情况下的冒泡就是逆序,此时你需要遍历n-1次数据,(数据为 3 2 1,一次遍历为2 1 3 ,二次遍历 1 2 3 结束 ),
* 此时的时间复杂度为O(n^2)
* 平均情况下也为O(n^2) 需要注意的是平均情况并不是与最坏情况下的时间复杂度相等,
* 平均的时间复杂度=sum(Pi*f(n));Pi为每种情况出现的概率,计算起来有些困难,在这里直接用前辈的结果
* 空间复杂度:只需要一个temp临时变量来交换数据,所以O(1)
*
*
* Ps:冒泡排序在数组基本有序,只有零星逆序的情况下效率极高
*/
public static void bubbleSort1(int[] a){
for (int k = 1; k < a.length ; k++) {
for (int i = 0; i < a.length - k; ++i) {
if (a[i] > a[i + 1]) {
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
}
public static void bubbleSort2(int[] a) {
boolean bol = true;
while (bol) {
bol = false;
for (int i = 0; i < a.length - 1; ++i) {
if (a[i] > a[i + 1]) {
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
bol = true;
}
}
}
}
Ps:博文为博主的学习笔记,算法只是按照自己的理解简单分析,初学者建议看详细的图文讲解,如果有错误,欢迎交流指正