冒泡排序
【罗马尼亚舞团】算法的艺术 - 冒泡排序
1.冒泡排序规则
- 两两比较,若a[i]>a[i+1],则交换两个元素,冒泡一遍能保证一个最值排到末尾;
- 重复以上步骤,直到整个数组有序。
public static void bubble(int[] a){
for(int j=0;j<a.length-1;j++){
for(int i=0;i<a.length-1-j;i++){
if(a[i]>a[i+1]){
swap(a,i,i+1);
}
}
}
}
public static void swap(int [] a,int i,int j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
2.优化方式
尽可能减少有序子序列的比较冒泡。
2.1 是否发生交换标记优化
标记是否发生交换,如果没有交换发生,则数组已经有序
public static void bubble(int[] a){
for(int j=0;j<a.length-1;j++){
boolean swapped = false;
for(int i=0;i<a.length-1-j;i++){
if(a[i]>a[i+1]){
swap(a,i,i+1);
swaped = true;
}
}
if(!swapped){
break;
}
}
}
2.2 标记每次冒泡最后发生交换的位置
记录最后一次交换元素的索引位置(每一次冒泡过程),可以作为为第二次冒泡的比较次数。如果这个位置为0,则代表冒泡结束,数组有序。
public static void bubble(int[] a){
int n = a.length-1;//每次冒泡需要循环的次数
while(true){
int last = 0;//标识最后一次发生交换时的所谓位置
for(int i=0;i<n;i++){
if(a[i]>a[i+1]){
swap(a,i,i+1);
swaped = true;
last = i;
}
}
n = last;
if(n == 0){
break;
}
}
}