标签:
题目链接:http://poj.org/problem?id=2299
题意就是求把数组按从小到大的顺序排列,每次只能交换相邻的两个数, 求至少交换了几次
就是求逆序数用归并排序
#include<stdio.h> #include<string.h> #include<algorithm> #define N 501000 using namespace std; int a[N], b[N]; __int64 cnt; void Merge(int r, int mid, int l) { int i = r, j = mid+1, k = 0; while(i<=mid && j<=l) { if(a[i] > a[j]) { b[k++] = a[j++]; cnt += mid-i+1; ///说明下标从i到mid的值都比a[j]大所以逆序数要+mid-i+1; } else if(a[i] < a[j]) { b[k++] = a[i++]; } else { b[k++] = a[i++]; j++; } } while(i<=mid) b[k++] = a[i++]; while(j<=l) b[k++] = a[j++]; for(i=0; i<k; i++)///将有序的临时数组 元素 刷回 被排序的数组 a 中, a[i+r] = b[i]; } void MergeSort(int r, int l) { int mid = (r+l)/2; if(r < l) { MergeSort(r, mid);///对前半部分进行排序 MergeSort(mid + 1, l);///对后半部分进行排序 Merge(r, mid, l);/// 合并前后两部分 } } int main() { int n; while(scanf("%d", &n),n) { cnt = 0; for(int i=0; i<n; i++) scanf("%d", &a[i]); MergeSort(0, n-1); printf("%I64d\n", cnt); } return 0; }
Ultra-QuickSort---poj2299 (归并排序)
标签:
原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4715681.html