1.基本思想:
依次两两比较,较小的浮上来,较大的往下沉。
2.算法分析:
平均时间复杂度:O(n2)
空间复杂度:O(1) (用于交换)
稳定性:稳定
3.算法实现:
public static void BubbleSort(int[] array){
int tmp;
for(int i=0 ; i< array.length-1 ; i++){
for(int j =1; j < array.length-i; j++){
if(array[j] < array[j-1]){ // 如果第j个元素 < 第j-1 个元素,交换位置,将大元素往后挪(下沉)
tmp=array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
}
}
}
4.算法优化:
加入一标志性变量flag,用于标志某一趟排序过程中是否有数据交换,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。
<span style="white-space:pre"> </span>public static void BubbleSort(int[] array){
int tmp;
boolean flag = true; //记录是否存在交换
for(int i=0; i< array.length-1 ; i++){
flag = false;
for(int j =1; j < array.length-i; j++){
if(array[j] < array[j-1]){
tmp=array[j];
array[j] = array[j-1];
array[j-1] = tmp;
flag = true;
}
}
if(! flag) break; 上一趟比较中不存在交换,则退出排序
}
}
传统的排序算法在一次排序中,只能找到一个最大值或最小值, 考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以确定两个最终值(最大者和最小者) , 从而使排序次数减少。
<span style="white-space:pre"> </span>public static void Bubble2Sort(int[] array){
int low= 0 , high = array.length -1;
int tmp;
while(low < high){
//正向,确定最大值
for(int i =low+1;i < high +1; i++){
if (array[i] < array[i-1]){
tmp=array[i];
array[i] = array[i-1];
array[i-1] = tmp;
}
}
low++;
//反向冒泡,确定最小值
for(int i =high-1 ;i >= low; i-- ){
if (array[i] < array[i-1]){
tmp=array[i];
array[i] = array[i-1];
array[i-1] = tmp;
}
}
high--;
}
}