排序
//插入排序 public static void insertionSort(int[] arr) { for (int j = 1; j < arr.length; j++) { int key = arr[j]; int i = j - 1; while (i >= 0 && arr[i] > key) { arr[i + 1] = arr[i]; i = i - 1; } arr[i + 1] = key; } } //选择排序 public static void selectionSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int minIdx = i; for (int j = i + 1; j < arr.length; j++) { if (arr[minIdx] > arr[j]) { minIdx = j; } } int temp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = temp; } } //归并排序 public static void mergeSort(int[] arr, int low, int high) { if ((low + 1) > high) { return; } int mid = (low + high) >> 1; mergeSort(arr, low, mid); mergeSort(arr, mid + 1, high); merge(arr, low, mid, high); } private static void merge(int[] arr, int low, int mid, int high) { int n1 = mid - low + 1; int n2 = high - mid; int[] left = new int[n1 + 1]; int[] right = new int[n2 + 1]; for(int i = 0; i < n1; i++) { left[i] = arr[low + i]; } for (int i = 0; i < n2; i++) { right[i] = arr[mid + 1 + i]; } left[n1] = Integer.MAX_VALUE; right[n2] = Integer.MAX_VALUE; int i = 0; int j = 0; int k = low; while (k <= high) { if (left[i] <= right[j]) { arr[k++] = left[i++]; } else { arr[k++] = right[j++]; } } } //快速排序 public static void quickSort(int arr[], int low, int high) { if (low >= high) { return; } int temp = arr[low]; int i = low; int j = high; while (i < j) { while (j > i && arr[j] >= temp) { j--; } arr[i] = arr[j]; while (i < j && arr[i] <= temp) { i++; } arr[j] = arr[i]; } arr[i] = temp; quickSort(arr, low, i - 1); quickSort(arr, i + 1, high); }
//堆排序 public static void heapSort(int[] arr) { buildMaxHeap(arr); for (int i = arr.length - 1; i > 0; i--) { swap(arr, i, 0); maxHeapify(arr, i, 0); } } //建堆 public static void buildMaxHeap(int[] arr) { for (int i = arr.length / 2 - 1; i >= 0; i--) { maxHeapify(arr, arr.length, i); } } //维护堆的性质 public static void maxHeapify(int[] arr, int len, int i) { int l = 2 * i + 1; int r = 2 * i + 2; int largest = i; if (l < len && arr[l] > arr[largest]) { largest = l; } if (r < len && arr[r] > arr[largest]) { largest = r; } if (largest != i) { swap(arr, i, largest); maxHeapify(arr, len, largest); } } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
//计数排序 public static int[] countSort(int[] arr) { int min = arr[0]; int max = arr[0]; for (int i = 0; i < arr.length; i++) { if (arr[i] < min) { min = arr[i]; } if (arr[i] > max) { max = arr[i]; } } int[] countArr = new int[max - min + 1]; for(int i = 0; i < arr.length; i++) { countArr[arr[i] - min]++; } for(int i = 1; i < countArr.length; i++) { countArr[i] = countArr[i] + countArr[i - 1]; } int[] sortedArr = new int[arr.length]; for (int i = arr.length - 1; i >= 0; i--) { sortedArr[countArr[arr[i] - min] - 1] = arr[i]; countArr[arr[i] - min]--; } return sortedArr; }