非学无以广才,非志无以成学。——诸葛亮
/** * * @author Jason Li 2014-5 * 归并排序 * */ public class MergeSort { public static void main(String[] args) { int[] dataArray = { 2, 6, 4, 9, 1, 7, 8, 3, 5 }; MergeSort(dataArray, 0, dataArray.length - 1); ArrayUtils.print(dataArray); } // 合并排序 private static void MergeSort(int[] dataArray, int p, int q) { if (p < q) {// 待排序部分多于1个元素时,分割 int r = (p + q) >> 1; // 在中间点分割 MergeSort(dataArray, p, r); // 递归左半边 MergeSort(dataArray, r + 1, q);// 递归右半边 Merge(dataArray, p, r, q);// 合并 } } // 将已排好序的两部分合并到一起 private static void Merge(int[] dataArray, int p, int r, int q) { int leftLength = r - p + 1; // 左边长度 int rightLength = q - r; // 右边长度 int[] leftArray = new int[leftLength]; // 左边临时数组 int[] rightArray = new int[rightLength]; // 右边临时数组 for (int i = 0; i < leftLength; i++) { // 左边部分 leftArray[i] = dataArray[p + i]; } for (int j = 0; j < rightLength; j++) { // 右边部分 rightArray[j] = dataArray[r + 1 + j]; } int leftIndex = 0; int rightIndex = 0; int dataIndex = p; // 合并 while (leftIndex < leftLength && rightIndex < rightLength) { if (leftArray[leftIndex] < rightArray[rightIndex]) { dataArray[dataIndex++] = leftArray[leftIndex++]; } else { dataArray[dataIndex++] = rightArray[rightIndex++]; } } // 如果左边有剩余 while (leftIndex < leftLength) { dataArray[dataIndex++] = leftArray[leftIndex++]; } // 如果右边有剩余 while (rightIndex < rightLength) { dataArray[dataIndex++] = rightArray[rightIndex++]; } } }