Java學習筆記——排序算法之O(n²)排序
阿新 • • 發佈:2017-05-12
blog sel != 而是 while bsp 優化 ++ logs
男兒何不帶吳鉤,收取關山五十州。請君暫上淩煙閣,若個書生萬戶侯?
——南園十三首 三種排序法: 1、冒泡法 2、簡單選擇法 3、直接插入法 上代碼: 1、冒泡排序1 public class BubbleSort { 2 3 //最簡單的排序,從0開始逐個對比往上冒 4 public static void bubbleSort(int[] arr) { 5 for (int i = 0; i < arr.length-1; i++) { 6 for (intj = i+1; j < arr.length; j++) { 7 if (arr[i]>arr[j]) { 8 arr[i] = arr[i]^arr[j]; 9 arr[j] = arr[i]^arr[j]; 10 arr[i] = arr[i]^arr[j]; 11 } 12 } 13 } 14 } 15 //正宗冒泡,正向 16 publicstatic void bubbleSortA(int[] arr) { 17 for (int i = 0; i < arr.length-1; i++) { 18 for (int j = 0; j < arr.length-i-1; j++) { 19 if (arr[j]>arr[j+1]) { 20 arr[j] = arr[j]^arr[j+1]; 21 arr[j+1] = arr[j]^arr[j+1]; 22 arr[j] = arr[j]^arr[j+1]; 23 } 24 } 25 } 26 } 27 //反向 28 public static void bubbleSortB(int[] arr) { 29 for (int i = 0; i < arr.length-1; i++) { 30 for (int j = arr.length-1; j > i; j--) { 31 if (arr[j-1]>arr[j]) { 32 arr[j] = arr[j]^arr[j-1]; 33 arr[j-1] = arr[j]^arr[j-1]; 34 arr[j] = arr[j]^arr[j-1]; 35 } 36 } 37 } 38 } 39 //優化冒泡 40 public static void bubbleSortA0(int[] arr) { 41 boolean flag = true; 42 for (int i = 0; i < arr.length-1 && flag; i++) { 43 flag = false; 44 for (int j = arr.length-1; j > i; j--) { 45 if (arr[j-1]>arr[j]) { 46 arr[j] = arr[j]^arr[j-1]; 47 arr[j-1] = arr[j]^arr[j-1]; 48 arr[j] = arr[j]^arr[j-1]; 49 flag = true;//若沒有發生交換,說明每對的前一位都不比後一位更大。無需再次排序 50 } 51 } 52 } 53 } 54 }
2、簡單選擇排序,跟冒泡第一個思路差不多。區別在於不是每次都交換,而是記錄最值的下標位置,每趟的最後交換
1 public class SimpleSelectSort { 2 3 //簡單冒泡的升級版,內外層循環不變,賦值n次,交換一次 4 public static void simpleSelectSort(int[] arr){ 5 int min; 6 for (int i = 0; i < arr.length-1; i++) { 7 min = i; 8 for (int j = i+1; j < arr.length; j++) { 9 if (arr[min] > arr[j]) { 10 min = j; 11 } 12 } 13 if (min != i) { 14 arr[min] = arr[min] ^ arr[i]; 15 arr[i] = arr[min] ^ arr[i]; 16 arr[min] = arr[min] ^ arr[i]; 17 } 18 } 19 } 20 }
3、直接插入法,這個思路就很好了,類似於捋牌。
1 public class StraightInsertionSort { 2 3 //該方法從第二位開始取出,如果比前面小插入,前面的後移,想象理牌5,3,4,6,2,同花順 4 public static void straightinsertionsort(int[] arr){ 5 int temp; 6 for (int i = 1,j = 0; i < arr.length; i++) { 7 if (arr[i]<arr[i-1]) { 8 temp = arr[i];//取出牌 9 j = i-1;//給內層循環賦初值 10 while (j>=0 && arr[j] > temp) { 11 arr[j+1] = arr[j];//比牌大的後移 12 j--; 13 } 14 arr[j+1] = temp;//插入牌 15 } 16 } 17 } 18 }
Java學習筆記——排序算法之O(n²)排序