排序算法之冒泡排序
冒泡算法的核心思想就是:相邻的两个一一比较,如果前一个大,就将两个交换。(这里假定我们是按从小到大的顺序)
根据这个思想写了以下四个实现方法:
1.bubbleSort1:考虑了边界条件,然后就是暴力比较了。
public static void bubbleSort1(int[] arr){
if (arr == null || arr.length < 2 ){
return ;
}
int length = arr.length;
int temp = 0;
for (int i =0; i < length-1; i++){
for (int j = 0; j < length-1; j++){
if (arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
2.bubbleSortImp:bubbleSort1的改进版,考虑到提前排好序的情况,只要在某一轮比较中没有发生交换,那么就确定该序列已经提前排好序了,因此设立了一个判断条件。
public static void bubbleSortImp(int[] arr){
if (arr == null || arr.length <2){
return;
}
int temp = 0;
for(int i = 0; i < arr.length-1; i++){
boolean change = false;
for(int j = 0; j < arr.length-1;j++){
if(arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
change = true;
}
}
if(!change){
break;
}
}
}
3.bubbleSortReverse:bubbleSortImp的逆序版
public static void bubbleSortReverse(int[] arr){
if(arr == null || arr.length < 2){
return;
}
int temp = 0;
for (int i = 0; i < arr.length-1; i++){
boolean isChange = false;
for (int j = 0; j < arr.length-1; j++){
if(arr[j] < arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
isChange = true;
}
}
if(!isChange){
break;
}
}
}
4.bubbleSortMax:bubbleSortImp的升级版,考虑到第一轮确定了最大的数放在最右边,因此我们在比较的时候就可以省去跟它比较了。第二轮确定的是次大的数,在最大数的左边,那么我们也不用再去比较了。因此在比较(内循环)的时候,j的边界值是逐渐递减的,递减的值大小与i的大小相等。
public static void bubbleSortMax (int[] arr){
if (arr == null || arr.length < 2){
return;
}
int temp = 0;
for(int i = 0; i < arr.length -1; i++){
boolean isChange = false;
for(int j = 0; j < arr.length -1 -i; j++){
if (arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
isChange = true;
}
}
if(!isChange){
break;
}
}
}
5.bubbleSortMaxPlus:bubbleSortMax的升级版。将是否需要再循环的判断直接放到for语句中,代码更加的整洁简单,逻辑清晰。
public static void bubbleSortMaxPlus (int[] arr){
if (arr == null || arr.length < 2){
return;
}
int temp = 0;
boolean needNextPass = true;
for(int i = 0; i < arr.length -1 && needNextPass; i++){
needNextPass = false;
for(int j = 0; j < arr.length -1 -i; j++){
if (arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
needNextPass = true;
}
}
}
}
浙公网安备 33010602011771号