思想
每一轮,从杂乱无章的数组头部开始,每两个元素比较大小并进行交换,直到这一轮当中最大或最小的元素被放置在数组的尾部,然后不断地重复这个过程,直到所有元素都排好位置。其中,核心操作就是元素相互比较。
代码
/**
* 冒泡排序: 从小到大
* 基本思想:
*
* 从左到右两两交换,将大的移动到最右边
* 使得右边变为有序,直到最左边
*
* 优化思想:
* 什么条件下表明已经是顺序的了
*/
public static int[] maopao(int[] arr){
/**
* 在一轮中如果一次交换都没有发生那么说明在任何位置都没有左边的数大于右边的数,这个时候可以退出所有循环
* 这是对冒泡排序的一种优化
*/
boolean hasChange = true;
int temp;
// 总共arr.length-1轮
for(int i = 0 ;i < arr.length-1 && hasChange;i++){
hasChange = false;
// 每一轮进行arr.length-1-i次交换 在这一整轮中,只要有一次hasChange = true,
// 那么就为true
for(int j = 0 ; j < arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
// 性能损耗在交换处
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
hasChange = true;
}
}
}
return arr;
}
算法分析:
最佳时间复杂度:n-1次比较,发现第一轮中没有任何交换,这时时间复杂度为O(n)
最坏情况:给定逆序排列,每轮都需要比较,总共(n-1)轮排序,每轮从n-1到1,
计算公式为: (1+(n-1))*(n-1)/2 = (n^2-n)/2 所以时间复杂为O(n^2)