归并排序:把一个数组分成两半,排序每一半,然后把两半归并成一个有序数组。每一半再细分成两半,形成一个递归。
MergeSort.java 代码
- public class MergeSort {
- private static int[] arrayMergeSort = { 43, 36, 11, 10, 29, 58, 15, 9 };
- public static void main(String[] args) {
- mergeSort();
- System.out.print("after merge sort: ");
- disp("", arrayMergeSort);
- }
- private static void mergeSort() {
- int[] workArray = new int[arrayMergeSort.length];
- recMergeSort(workArray, 0, arrayMergeSort.length - 1);
- }
- private static void recMergeSort(int[] workArray, int lowerBound,
- int upperBound) {
- if (lowerBound == upperBound) {
- return;
- } else {
- int mid = (lowerBound + upperBound) / 2;
- recMergeSort(workArray, lowerBound, mid);
- recMergeSort(workArray, mid + 1, upperBound);
- merge(workArray, lowerBound, mid + 1, upperBound);
- }
- }
- private static void merge(int[] workArray, int lowerPos, int upperPos,
- int upperBound) {
- int i = 0;
- int lowerBound = lowerPos;
- int mid = upperPos - 1;
- int num = upperBound - lowerBound + 1;
- while (lowerPos <= mid && upperPos <= upperBound) {
- if (arrayMergeSort[lowerPos] < arrayMergeSort[upperPos])
- workArray[i++] = arrayMergeSort[lowerPos++];
- else
- workArray[i++] = arrayMergeSort[upperPos++];
- }
- while (lowerPos <= mid) {
- workArray[i++] = arrayMergeSort[lowerPos++];
- }
- while (upperPos <= upperBound) {
- workArray[i++] = arrayMergeSort[upperPos++];
- }
- for (i = 0; i < num; i++) {
- arrayMergeSort[lowerBound + i] = workArray[i];
- }
- disp("temp array: ", workArray);
- disp("sort array: ", arrayMergeSort);
- }
- private static void disp(String s, int[] array) {
- System.out.print(s);
- for (int i = 0; i < array.length; i++) {
- System.out.print(array[i] + " ");
- }
- System.out.println("");
- }
- }
实际运行结果如下:
- temp array: 36 43 0 0 0 0 0
- sort array: 36 43 11 10 29 58 15
- temp array: 10 11 0 0 0 0 0
- sort array: 36 43 10 11 29 58 15
- temp array: 10 11 36 43 0 0 0
- sort array: 10 11 36 43 29 58 15
- temp array: 29 58 36 43 0 0 0
- sort array: 10 11 36 43 29 58 15
- temp array: 15 29 58 43 0 0 0
- sort array: 10 11 36 43 15 29 58
- temp array: 10 11 15 29 36 43 58
- sort array: 10 11 15 29 36 43 58
- after merge sort: 10 11 15 29 36 43 58