JS Bin

归并排序算法的实现

  采用分治思想,分治其实也是一种递归,递归的三个条件:递推公式,终止条件,递归代码实现

package dsaa.归并排序;

import java.util.Arrays;

/*
 * 归并排序
 * */
public class MergeSortSolution {
	public static int[] mergeSort(int[] a, int size) {
		if (size <= 1)
			return a;
		return mergeSortSolution(a);

	}

	private static int[] mergeSortSolution(int[] a) {
		/* 终止条件 */
		if (a.length <= 1)
			return a;
		/* 每次递归调用中间位置作为子序列的分割点 */
		int mid = a.length / 2;
		/* 分治递归 */
		int[] leftArray = mergeSortSolution(Arrays.copyOfRange(a, 0, mid));
		int[] rightArray = mergeSortSolution(Arrays.copyOfRange(a, mid, a.length));
		int[] temp = merge(a, leftArray, rightArray);
		return temp;
	}

	private static int[] merge(int[] a, int[] leftArray, int[] rightArray) {
		int[] temp = new int[a.length];
		int i = 0;
		int j = 0;
		int k = 0;
		while (k < temp.length) {
			while (i < leftArray.length && j < rightArray.length) {
				if (leftArray[i] < rightArray[j]) {
					temp[k] = leftArray[i];
					++k;
					++i;
				} else {
					temp[k] = rightArray[j];
					++k;
					++j;
				}
				if (i >= leftArray.length) {
					for (int l = j; l < rightArray.length; ++l) {
						temp[k] = rightArray[l];
						++k;
					}
				}
				if (j >= rightArray.length) {
					for (int m = i; m < leftArray.length; ++m) {
						temp[k] = leftArray[m];
						++k;
					}
				}
			}
		}

		return temp;
	}

	public static void main(String[] args) {
		int[] a = { 4, 3, 5, 6, 1, 7, 2 };
		int size = a.length;
		int[] result = MergeSortSolution.mergeSort(a, size);
		for (int i = 0; i < result.length; ++i) {
			System.out.print(result[i] + " ");
		}
	}
}

  

posted @ 2020-05-13 22:29  左五六  阅读(199)  评论(0编辑  收藏  举报