1. 程式人生 > >Java學習筆記——排序算法之O(n²)排序

Java學習筆記——排序算法之O(n²)排序

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 (int
j = 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 public
static 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²)排序