#include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #define MAXINT (1<<30) void InsertSort(int *a, int n) { int tmp, j; for (int i = 1; i < n; ++i){ tmp = a[i]; j = i - 1; while (j >= 0 && a[j]>tmp){ a[j + 1] = a[j]; --j; } a[j + 1] = tmp; } } void merge(int *a, int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; int *L = (int*)malloc((n1 + 1)*sizeof(int)); int *R = (int*)malloc((n2 + 1)*sizeof(int)); for (int i = 0; i < n1; ++i) L[i] = a[p + i]; for (int i = 0; i < n2; ++i) R[i] = a[q + 1 + i]; L[n1] = R[n2] = MAXINT; int i, j; i = j = 0; for (int k = p; k <= r; ++k){ if (L[i] < R[j]){ a[k] = L[i]; ++i; } else{ a[k] = R[j]; ++j; } } free(L); free(R); } void mergeSort(int *a, int p, int r) { if (p < r){ int q = (r + p) / 2; mergeSort(a, p, q); mergeSort(a, q + 1, r); merge(a, p, q, r); } } void printArray(int *a, int n) { for (int i = 0; i < n; ++i) printf("%d ", a[i]); printf(" "); } //逆序对 n^2 int inversion(int *a, int n) { int count = 0; for (int i = 0; i < n - 1; ++i) for (int j = i + 1; j < n; ++j) if (a[i]>a[j]) ++count; return count; } //逆序对 nlgn int InversionMerge(int *a, int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; int *L = (int*)malloc((n1 + 1)*sizeof(int)); int *R = (int*)malloc((n2 + 1)*sizeof(int)); for (int i = 0; i < n1; ++i) L[i] = a[p + i]; for (int i = 0; i < n2; ++i) R[i] = a[q + 1 + i]; L[n1] = R[n2] = MAXINT; int i, j, count; i = j = count = 0; for (int k = p; k <= r; ++k){ if (L[i] <= R[j]){ a[k] = L[i]; ++i; } else{ a[k] = R[j]; ++j; count += n1 - i; //L中有 n1-i 个大于 R[j] 的项,此操作会使数组的逆序对减少 n1-i 个 } } free(L); free(R); return count; } int InversionMergeSort(int *a, int p, int r) { int count = 0; if (p < r){ int q = (r + p) / 2; count += InversionMergeSort(a, p, q) + InversionMergeSort(a, q + 1, r) + InversionMerge(a, p, q, r); } return count; } int main() { srand(time(NULL)); const int cnt = 10; int a[cnt]; for (int i = 0; i < cnt; ++i) a[i] = rand() % 100; //mergeSort(a, 0,cnt-1); for (int i = 0; i < cnt; ++i) printf("%d ", a[i]); printf(" "); printf("%d ", inversion(a, cnt)); printf("%d ", InversionMergeSort(a, 0, cnt - 1)); }