排序算法之冒泡排序
冒泡算法的核心思想就是:相邻的两个一一比较,如果前一个大,就将两个交换。(这里假定我们是按从小到大的顺序)
根据这个思想写了以下四个实现方法:
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; } } } }