合并排序

非学无以广才,非志无以成学。——诸葛亮

/**
 * 
 * @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++];
		}

	}
}


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