poj 求逆序对数

来源:互联网 发布:制作h5的软件 编辑:程序博客网 时间:2024/05/18 21:41

核心思想当然是在归并排序的过程中完成逆序对数的计算咯……很好懂吧

看看代码就知道具体过程了嗯:

#include <cstdio>#include <cstring>#define MAXSIZE 20010int A[MAXSIZE]; int N;int cnt;void merge_sort(int front,int rear) {if (rear - front <= 1) return;int mid = (front + rear) / 2;merge_sort(front,mid);merge_sort(mid,rear);int *tmp = new int[rear - front]; int ptr = 0;int i = front; int j = mid;while (i < mid && j < rear) {if (A[i] <= A[j])tmp[ptr++] = A[i++];else {tmp[ptr++] = A[j++];cnt += mid - i;// 当A[i] > A[j]时,i以及后面的所有元素均与A[j]构成逆序对}}while (i < mid) tmp[ptr++] = A[i++];while (j < rear) tmp[ptr++] = A[j++];memcpy(A + front,tmp,ptr * sizeof(int));delete []tmp;}int main() {while (scanf("%d",&N) && N) {cnt = 0;memset(A,0,sizeof(A));for (int i = 0; i < N; i++) scanf("%d",&A[i]);merge_sort(0,N);printf("%d\n",cnt);}return 0;}


原创粉丝点击