冒泡排序(三种实现两种优化)
排序思想: 相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其它的数进行类似操作。
初级版
public static void bubbleSort(int[] arr) { int swap; for (int i = 0; i < arr.length-1; i++) { for (int j = arr.length-1; j > i; j--) { if (arr[j-1] > arr[j]) { swap = arr[j-1]; arr[j-1] = arr[j]; arr[j] = swap; } } } //打印数组 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
改进版1:设置一个标志性变量pos,用于记录每趟排序中最后一次进行交换的位置,由于pos位置之后的记录均已交换到位,故在进行下一趟排序是只要扫描到pos位置即可。
public static void bubbleSort(int[] arr) { int swap; int pos=0;//记录本次循环,最后交换的位置 int k = arr.length -1; for (int i = 0; i < arr.length -1; i++) { for (int j = 0;j < k ; j++) { if (arr[j] > arr[j+1]) { swap = arr[j]; arr[j] = arr[j+1]; arr[j+1] = swap; pos = j + 1; } } k = pos; } //打印数组 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }
改进版2:如果数组已经有序,则直接返回。加一个flag
public static void bubbleSort(int[] arr) { int swap; int pos=0;//记录本次循环,最后交换的位置 int k = arr.length -1; int flag = 1;//假设已经有序 for (int i = 0; i < arr.length -1; i++) { for (int j = 0;j < k ; j++) { if (arr[j] > arr[j+1]) { swap = arr[j]; arr[j] = arr[j+1]; arr[j+1] = swap; pos = j + 1; flag = 0; } } k = pos; if(flag == 1){// 如果本趟走完没有交换,则有序 break; } } //打印数组 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }