冒泡排序
冒泡排序是把較小的數據往前調或者把較大的數據往后調。主要是通過對相鄰兩個元素進行大小的比較,根據比較結果和算法規則對該二元素的位置進行交換,這樣逐個依次進行比較和交換,就能達到排序目的。
1 //冒泡排序 2 public static void bubbleSort(int[] arr) { 3 for (int i = 0; i < arr.length - 1; i++) { 4 for (int j = 0; j < arr.length - 1 - i; j++) { 5 if (arr[j] > arr[j + 1]) { 6 int temp = arr[j]; 7 arr[j] = arr[j + 1]; 8 arr[j + 1] = temp; 9 } 10 } 11 } 12 }
插入排序
將一個記錄插入到已排好序的序列中,從而得到一個新的有序序列,將序列的第一個數據看成是一個有序的子序列,然后從第二個記錄逐個向該有序的子序列進行有序的插入,直至整個序列有序
1 //直接插入排序 2 public static void insertSort(int[] arr) { 3 //從第二個數字開始 4 for (int i = 1; i < arr.length; i++) { 5 //當前數字小於前一個數 6 if (arr[i] < arr[i - 1]) { 7 //當前數字保存至臨時變量 8 int temp = arr[i]; 9 int j; 10 //遍歷當前數字之前的所有數字進行比較,是否大於當前數字 11 for (j = i - 1; j >= 0 && temp < arr[j]; j--) { 12 //把滿足條件的數字向后移位 13 arr[j + 1] = arr[j]; 14 } 15 //不滿足條件則表示當前數字比臨時變量的數字小 16 arr[j + 1] = temp; 17 } 18 } 19 }
選擇排序
選擇排序是為每一個位置選擇當前最小的元素。首先從第1個位置開始對全部元素進行選擇,選出全部元素中最小的給該位置,再對第2個位置進行選擇,在剩余元素中選擇最小的給該位置即可;以此類推,重復進行“最小元素”的選擇,直至完成第(n-1)個位置的元素選擇,則第n個位置就只剩唯一的最大元素,此時不需再進行選擇。
1 //選擇排序 2 public static void selectSort(int[] arr) { 3 //遍歷所有元素 4 for (int i = 0; i < arr.length; i++) { 5 //記錄最小值得下標 6 int minIndex = i; 7 //與后面每個元素進行比較 8 for (int j = i + 1; j < arr.length; j++) { 9 //如果有元素比minIndex還小 10 if (arr[minIndex] > arr[j]) { 11 //則當前元素就位minIndex 12 minIndex = j; 13 } 14 } 15 //如果當前下標和minIndex不相等,說明它比minIndex還小,那么就移位 16 if (i != minIndex) { 17 int temp = arr[i]; 18 arr[i] = arr[minIndex]; 19 arr[minIndex] = temp; 20 } 21 } 22 }
快速排序
通過一次排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一不部分的所有數據都要小,然后再按次方法對這兩部分數據分別進行快速排序
1 //快速排序 2 public static void QuickSort(int[] arr, int start, int end) { 3 //記錄基准數 4 int stard = arr[start]; 5 //低位起始下標 6 int low = start; 7 //高位起始下標 8 int higt = end; 9 //滿足start<end保證數據不會多余重復比較 10 if (start < end) { 11 //低位下標小於高位下標,開始比較 12 while (low < higt) { 13 //低位下標小於高位下標,並且高位數大於等於基准數 14 while ((low < higt) && stard <= arr[higt]) { 15 //高位數依次向前比較 16 higt--; 17 } 18 //不滿足條件時,當前高位數覆蓋當前低位數,第一次覆蓋時低位數是基准數 19 arr[low] = arr[higt]; 20 //低位下標小於高位下標,並且低位數小於等於基准數 21 while ((low < higt && arr[low] <= stard)) { 22 //低位數依次向后比較 23 low++; 24 } 25 //不滿足條件時,當前低位數覆蓋當前高位數 26 arr[higt] = arr[low]; 27 } 28 //比較完成后,高位數下標和低位數下標重合,把基准數賦值給重合的位置 29 arr[higt] = stard; 30 //繼續遞歸排序低位數 31 QuickSort(arr, start, low); 32 //繼續遞歸排序高位數 33 QuickSort(arr, low + 1, end); 34 } 35 }
歸並排序
歸並排序是把集合遞歸划分成為兩個短集合,再將兩個集合各自再分成兩組組。依次類推,當分出來的一個集合只有一個數據時,可以認為這個集合內已經達到了有序,然后再合並相鄰的二個集合就可以了。這樣通過先遞歸的分解集合,再合並集合就完成了歸並排序。
1 //歸並排序 2 public static void mergeSort(int[] arr, int low, int high) { 3 int middle = (low + high) / 2; 4 if (low < high) { 5 //處理左邊 6 mergeSort(arr, low, middle); 7 //處理右邊 8 mergeSort(arr, middle + 1, high); 9 //歸並 10 merge(arr, low, middle, high); 11 } 12 } 13 14 public static void merge(int[] arr, int low, int middle, int high) { 15 //臨時數組 16 int[] temp = new int[high - low + 1]; 17 //臨時數組下標記錄 18 int index = 0; 19 //第一組需要遍歷的起始下標 20 int i = low; 21 //第二組需要遍歷的起始下標 22 int j = middle + 1; 23 //遍歷兩個數組,取出最小數放入臨時數組 24 while (i <= middle && j <= high) { 25 if (arr[i] <= arr[j]) { 26 temp[index] = arr[i]; 27 i++; 28 } else { 29 temp[index] = arr[j]; 30 j++; 31 } 32 index++; 33 } 34 //處理多余的數據 35 while (j <= high) { 36 temp[index] = arr[j]; 37 j++; 38 index++; 39 } 40 while (i <= middle) { 41 temp[index] = arr[i]; 42 i++; 43 index++; 44 } 45 //把臨時數組中的數據重新放入原數組 46 for (int k = 0; k < temp.length; k++) { 47 arr[k + low] = temp[k]; 48 49 } 50 }