归并排序 (一)

import java.util.ArrayList;

public class MergeSort {

	int g_nCount;
	public static ArrayList<Integer> t = new ArrayList<Integer>();

	void mergesort(int a[], int first, int last) {
		if (first < last) {
			int mid = (first + last) / 2;
			mergesort(a, first, mid); // 左边有序
			mergesort(a, mid + 1, last); // 右边有序
			mergeArray(a, first, mid, last); // 再将二个有序数列合并
		}
	}

	void mergeArray(int a[], int first, int mid, int last) {
		int i = first, j = mid + 1;
		int m = mid, n = last;
		// System.out.print(i + "-" + m + "-" + n + " ");
		while (i <= m && j <= n) // a[i] 前面的数 a[j] 后面的数
		{
			if (a[i] < a[j]) {
				t.add(a[i++]);
			} else {
				t.add(a[j++]);
				// a[j]和前面每一个数都能组成逆序数对
				g_nCount += m - i + 1;
			}
		}
		while (i <= m) {
			t.add(a[i++]);
		}
		while (j <= n) {
			t.add(a[j++]);
		}
		for (i = 0; i < t.size(); i++) {
			a[first + i] = t.get(i).intValue();
			// System.out.print(a[first + i] + " ");
		}
		t.clear();
		// System.out.println();
	}

	void mergeSort2(int a[]) {
		int n = a.length;
		int s = 2, i;
		while (s < n) {
			i = 0;
			while (i + s <= n) {
				mergeArray(a, i, i + s / 2 - 1, i + s - 1);
				i += s;
			}
			// 处理末尾残余部分
			if ((i + s / 2 - 1) < (n - 1)) {
				mergeArray(a, i, i + s / 2 - 1, n - 1);
			}
			s *= 2;
		}
		// 最后再从头到尾处理一遍
		mergeArray(a, 0, s / 2 - 1, n - 1);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值