一、原始版冒泡算法:暴力美学!!!
import java.util.Arrays;
public class yuanshimaopao {
public static void sort(int array[]){
//中间变量,用于暂存数据
int tmp = 0;
for(int i = 0; i < array.length; i++){
for( int j = 0; j < array.length - i - 1; j++){
if(array[j] > array[j+1]) {
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
}
public static void main(String[] args){
int[] array = {3,5,1,4,6,2,7,8,9};
sort(array);
System.out.println(Arrays.toString(array));
}
}
二、改良版冒泡算法:在后续遍历中可能在全部遍历结束前,数组已经是有序的了,此时,可以跳出遍历了。
import java.util.Arrays;
public class maopaogailiang01 {
public static void sort(int array[]){
//中间变量,用于暂存数据
int tmp = 0;
//判断是否本次遍历不存在元素交换情况
boolean sorted = true;
for(int i = 0; i < array.length; i++){
for( int j = 0; j < array.length - i - 1; j++){
if(array[j] > array[j+1]) {
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
//出现了排序情况
sorted = true;
}
}
//本轮未出现 排序情况,可以视为数组已有序
if (!sorted){
break;
}
}
}
public static void main(String[] args){
int[] array = {3,5,1,4,6,2,7,8,9};
sort(array);
System.out.println(Arrays.toString(array));
}
}
三、再次改良版冒泡算法:在初始遍历时可能在数组右侧已经存在部分有序的数组片段了,此时,可以跳过多有序片段的遍历。
import java.util.Arrays;
public class maopaogailiang02 {
public static void sort(int array[]){
//中间变量,用于暂存数据
int tmp = 0;
//判断是否本次遍历不存在元素交换情况
boolean sorted = true;
//保存数组无序部分的边界
int border = array.length-1;
//记录最后一次出现交换的下标
int lastjiaohuan = 0;
for(int i = 0; i < array.length; i++){
for( int j = 0; j < border; j++){
if(array[j] > array[j+1]) {
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
//出现了排序情况
sorted = true;
lastjiaohuan = j;
}
}
//本轮未出现 排序情况,可以视为数组已有序
if (!sorted){
break;
}
border = lastjiaohuan;
}
}
public static void main(String[] args){
int[] array = {3,5,1,4,6,2,7,8,9};
sort(array);
System.out.println(Arrays.toString(array));
}
}