package com.sort;
/**
* 冒泡排序算法
* 比较相邻的元素,如果第一个比第二个大,就交换它们。
* 对每一对相邻元素做同样的工作,从开始的第一对到结尾的最后一对,在这一点上,最后元素是最大的数。
* 针对所有的元素重复以上的动作,除了最后一个元素。
* 持续每次对越来越少的元素重复上面的动作,直到没有任何一对元素需要比较。
*
* 时间复杂度
* 平均情况:O(n2), 最好情况:O(n), 最坏情况:O(n2)
*
* 空间复杂度
* 辅助存储:O(1)
*
* 稳定性:稳定
*/
public class BubbleSort{
/**
*
* @Title: sort
* @Description: 假设数组长度为n,每完成一次大循环将最小的冒泡到上端,要完成所有元素排序,需要经过n次大循环,
* 小循环进行两两相邻元素对比,如果反序则交换位置,小循环从最后开始比较,次数逐次递减,
* 加入flag布尔变量改进冒泡算法,使其对有序数组的排序时间复杂度变为O(n)。
*/
public static void sort(Comparable[] a) {
int compareNum = 0;
int swapNum = 0;
int size = a.length;
boolean flag = true;
for(int i=0; i<size && flag; i++) {
flag = false;
for(int j=size-1; j>i; j--) {
System.out.println("compare num:" + (++compareNum));
if(less(a[j], a[j-1])) {
swap(a, j, j-1);
flag = true;
System.out.println("swap num:" + (++swapNum));
}
}
}
}
public static void show(Comparable[] a) {
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void swap(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void main(String[] args) {
Integer a[] = {23, 44, 56, 91, 2, 0, 81,100, 3, 17};
Integer b[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//无序数组排序
sort(a);
show(a);
//有序数组排序
sort(b);
show(b);
}
}