归并排序
import java.util.Arrays;public class Merge { public static void main(String[] args) { int[] a = {9,8,7,6,5,4,3,2,1,0}; new Merge().sort(a,10); System.out.println(Arrays.toString(a)); } public void sort(int[] a, int n) { mergesort(a,0, n-1); } public void mergesort(int[] a, int left, int right){ if(left>=right) return; int mid = (right+left)/2; mergesort(a, left, mid); mergesort(a, mid+1, right); merge(a, left, mid, right); } //将a[left,mid] 和 a[mid+1, right]合并为a[left, right] public void merge(int[] a, int left, int mid, int right){ int i = left; int j = mid+1; int t = 0; int[] temp = new int[right-left+1]; while (i<=mid && j<=right){ if(a[i]<=a[j]){ temp[t++] = a[i++]; }else { temp[t++] = a[j++]; } } //判断哪个子数组还有元素 int start = i; int end = mid; if(j<=right){ start = j; end = right; } while(start <= end){ temp[t++] = a[start++]; } //将temp数组拷回a[left,right] //if (right - left + 1 >= 0) System.arraycopy(temp, 0, a, left + 0, right - left + 1); for (int k = 0; k <= right-left; k++) { a[left+k] = temp[k]; } }}
堆排序
/** * 堆排序 */public class HeapSort { /** * 排序 * 堆元素是从数组下标0开始 * @param arr */ public static void sort(int[] arr) { if (arr.length <= 1) { return; } // 1、建堆 buildHeap(arr); // 2、排序 int k = arr.length - 1; while (k > 0) { // 将堆顶元素(最大)与最后一个元素交换位置 swap(arr, 0, k); // 将剩下元素重新堆化,堆顶元素变成最大元素 heapify(arr, --k, 0); } } /** * 建堆 * * @param arr */ private static void buildHeap(int[] arr) { // (arr.length - 1) / 2 为最后一个叶子节点的父节点 // 也就是最后一个非叶子节点,依次堆化直到根节点 for (int i = (arr.length - 1) / 2; i >= 0; i--) { heapify(arr, arr.length - 1, i); } } /** * 堆化 * * @param arr 要堆化的数组 * @param n 最后堆元素下标 * @param i 要堆化的元素下标 */ private static void heapify(int[] arr, int n, int i) { while (true) { // 最大值位置 int maxPos = i; // 与左子节点(i * 2 + 1)比较,获取最大值位置 if (i * 2 + 1 <= n && arr[i] < arr[i * 2 + 1]) { maxPos = i * 2 + 1; } // 最大值与右子节点(i * 2 + 2)比较,获取最大值位置 if (i * 2 + 2 <= n && arr[maxPos] < arr[i * 2 + 2]) { maxPos = i * 2 + 2; } // 最大值是当前位置结束循环 if (maxPos == i) { break; } // 与子节点交换位置 swap(arr, i, maxPos); // 以交换后子节点位置接着往下查找 i = maxPos; } }}
快速排序
public class QuickSort { // 快速排序,a是数组,n表示数组的大小 public static void quickSort(int[] a, int n) { quickSortInternally(a, 0, n-1); } // 快速排序递归函数,p,r为下标 private static void quickSortInternally(int[] a, int p, int r) { if (p >= r) return; int q = partition(a, p, r); // 获取分区点 quickSortInternally(a, p, q-1); quickSortInternally(a, q+1, r); } private static int partition(int[] a, int p, int r) { int pivot = a[r]; int i = p; for(int j = p; j < r; ++j) { if (a[j] < pivot) { if (i == j) { ++i; } else { int tmp = a[i]; a[i++] = a[j]; a[j] = tmp; } } } int tmp = a[i]; a[i] = a[r]; a[r] = tmp; System.out.println("i=" + i); return i; }}