[关闭]
@lychee123 2017-01-25T22:42:05.000000Z 字数 1162 阅读 3059

POJ:2299-Ultra-QuickSort(归并排序,求逆序数)

归并排序


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. using namespace std;
  5. long long num[500005];
  6. long long temp[500005];
  7. long long ans;
  8. void merge(int l,int mid,int r)
  9. {
  10. int i=l;
  11. int j=mid+1;
  12. int k=l;
  13. while(i<=mid&&j<=r)
  14. {
  15. if(num[i]<=num[j])
  16. temp[k++]=num[i++];
  17. else
  18. {
  19. ans+=j-k;
  20. temp[k++]=num[j++];
  21. }
  22. }
  23. while(i<=mid)
  24. temp[k++]=num[i++];
  25. while(j<=r)
  26. temp[k++]=num[j++];
  27. for(i=l;i<=r;i++)
  28. num[i]=temp[i];
  29. }
  30. void mergesort(int a,int b)
  31. {
  32. if(a<b)
  33. {
  34. int mid=(a+b)/2;
  35. mergesort(a,mid);
  36. mergesort(mid+1,b);
  37. merge(a,mid,b);
  38. }
  39. }
  40. int main()
  41. {
  42. long long n,i;
  43. while(scanf("%lld",&n),n)
  44. {
  45. ans=0;
  46. for(int i=0;i<n;i++)
  47. scanf("%lld",&num[i]);
  48. mergesort(0,n-1);
  49. printf("%lld\n",ans);
  50. }
  51. return 0;
  52. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注