java排序之归并排序

归并排序的思想简单,但是实现起来有点难,思想就是通过将数组分开,然后将数组合并起来,但是,注解的问题我过一段时间补上,感觉对递归理解的还不够透彻。对了以下的代码来自百度百科

代码:

package com.jk.merge;

import java.util.Arrays;

/**
 * 
 * @author jk 这段代码来自百度百科,这个是归并排序,归并算法的思想很简单,可能是我对递归理解的还不够深刻,写这段代码的时候感觉还有点难,
 *         递归就是将一个数组分开,然后将数组合并起来的过程,其实我感觉就和插入差不多的,只是它要小一些
 * 
 */
public class test {

	public static void main(String[] args) {
		int[] a = new int[] { 1, 5, 2, 66, 7, 3 };
		mergeSort(a, 0, 1);
		System.out.println(Arrays.toString(a));
	}

	private static void mergeSort(int[] a, int s, int len) {
		int size = a.length;
		int mid = size / (len << 1);
	
		int c = size & ((len << 1) - 1);
	
		if (mid == 0)
			return;
	
		for (int i = 0; i < mid; i++) {
			s = i * 2 * len;
			merge(a, s, s + len, (len << 1) + s - 1);
		}

		if (c != 0) {
			merge(a, size - c - 2 * len, size - c, size - 1);
		}
		mergeSort(a, 0, 2 * len);

	}

	/**
	 * 
	 * @param 原来的数组
	 * @param 第一个有序表的起始下标
	 * @param 第二个有序表的起始下标
	 * @param 第三个有序表的结束下标
	 */
	private static void merge(int[] a, int s, int m, int t) {
		int[] tmp = new int[t - s + 1];
		int i = s, j = m, k = 0;
		while (i < m && j <= t) {
			if (a[i] <= a[j]) {
				tmp[k] = a[i];
				k++;
				i++;
			} else {
				tmp[k] = a[j];
				j++;
				k++;
			}
		}
		while (i < m) {
			tmp[k] = a[i];
			i++;
			k++;
		}
		while (j <= t) {
			tmp[k] = a[j];
			j++;
			k++;
		}

		System.arraycopy(tmp, 0, a, s, tmp.length);
	}

}

你可能感兴趣的:(Java排序)