一、 选择排序
/** * 选择排序: int arr[] = { 5, 6, 2, 7, 8, 6, 4 }; * * 第0趟 5 2 6 7 6 4 8 第1趟 2 5 6 6 4 7 8 第2趟 2 5 6 4 6 7 8 第3趟 2 5 4 6 6 7 8 第4趟 2 4 5 6 6 7 8 第5趟 2 4 5 6 6 7 8 第6趟 2 4 5 6 6 7 8 */ public void selectSorted(int arr[]) { int n = arr.length; for (int i = 0; i < n; i++) { for (int j = 0; j < n - 1; j++) { if (arr[j + 1] < arr[j]) swap(arr, j, j + 1); } System.out.println("\n" + "第" + i + "趟"); printArray(arr); } }
二、插入排序
/** * 插入排序 : int arr[] = { 5, 6, 2, 7, 8, 6, 4 }; * 第1趟 5 6 2 7 8 6 4 第2趟 2 5 6 7 8 6 4 第3趟 2 5 6 7 8 6 4 第4趟 2 5 6 7 8 6 4 第5趟 2 5 6 6 7 8 4 第6趟 2 4 5 6 6 7 8 */ public void insertSorted(int arr[]) { int n = arr.length; for (int i = 1; i < n; i++) { for (int j = i; j > 0; j--) { if (arr[j] < arr[j - 1]) swap (arr,j, j - 1); } System.out.println("\n" + "第" + i + "趟"); printArray(arr); } } // 效率更优,减少不必要的交换 public void insertSorted2(int arr[]) { int n = arr.length; for (int i = 1; i < n; i++) { int ele = arr[i]; // 当前待比较的元素 int j; // 当前元素最终的下标位置 for (j = i; j > 0 && arr[j - 1] > ele; j--) arr[j] = arr[j - 1]; arr[j] = ele; System.out.println("\n" + "第" + i + "趟"); printArray(arr); } }
三、冒泡排序
/** * 冒泡排序 : int arr[] = { 5, 6, 2, 7, 8, 6, 4 }; * * 第0趟 5 2 6 7 6 4 8 第1趟 2 5 6 6 4 7 8 第2趟 2 5 6 4 6 7 8 第3趟 2 5 4 6 6 7 8 第4趟 2 4 5 6 6 7 8 第5趟 2 4 5 6 6 7 8 第6趟 2 4 5 6 6 7 8 */ public void bubbleSorted(int arr[]) { int n = arr.length; for (int i = 0; i < n; i++) { for (int j = 0; j < n - i - 1; j++) if ( arr[j] > arr[j + 1]) swap(arr, j, j + 1); System.out.println("\n" + "第" + i + "趟"); printArray(arr); } }
四、归并排序
/** * 归并排序 : 4 5 2 7 1 6 3 4 5 2 7 1 6 3 2 4 5 7 1 6 3 2 4 5 7 1 6 3 2 4 5 7 1 3 6 1 2 3 4 5 6 7 */ public void mergeSorted(int arr[]) { int n = arr.length - 1; // 闭区间 splitArray(arr, 0, n); } private void splitArray(int[] arr, int L, int R) { if (L >= R) { return; } int mid = L + (R - L) / 2; splitArray(arr, L, mid); splitArray(arr, mid + 1, R); // merge(arr, L, mid, R); // 优化 if (arr[mid] > arr[mid + 1]) merge(arr, L, mid, R); printArray(arr); System.out.println(); } private void merge(int[] arr, int L, int mid, int R) { int aux[] = new int[R - L + 1]; for (int i = L; i <= R; i++) { aux[i - L] = arr[i]; } int i = L; int j = mid + 1; for (int k = L; k <= R; k++) { if (i > mid) { arr[k] = aux[j - L]; j++; } else if (j > R) { arr[k] = aux[i - L]; i++; } else if (aux[i - L] < aux[j - L]) { arr[k] = aux[i - L]; i++; } else if (aux[i - L] > aux[j - L]) { arr[k] = aux[j - L]; j++; } else { // 相等情况, arr[k] = aux[j - L]; j++; } } }