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);
}
}
归并排序 (一)
最新推荐文章于 2024-03-26 17:18:09 发布