归并排序求逆序数对。

技术分享
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cstring>
 4 #include <vector>
 5 using namespace std;
 6 int high[100010];
 7 int temp[100010];
 8 int angry[100010];
 9 int num;
10 void mergesort(int first,int mid,int last)
11 {
12     int left1=first,right1=mid,left2=mid+1,right2=last;
13     int i=0;
14     while(left1<=right1&&left2<=right2)
15     {
16         if(high[left1]<=high[left2])
17         {
18             temp[i++]=high[left1++];
19         }
20         else
21         {
22             temp[i++]=high[left2++];
23             angry[left2]+=right1-left1+1;
24             num+=right1-left1+1;
25             for(int j=left1; j<=right1; j++)
26             {
27                 angry[j]++;
28             }
29 
30         }
31     }
32     if(left1>right1)
33     {
34         while(left2<=right2)
35         {
36             temp[i++]=high[left2++];
37         }
38     }
39     else if(left2>right2)
40     {
41         while(left1<=right1)
42         {
43             temp[i++]=high[left1++];
44         }
45     }
46     for(int i=0; i<last-first+1; i++)
47     {
48         high[first+i]=temp[i];
49     }
50 
51 }
52 void Sort(int first,int last)
53 {
54     if(first<last)
55     {
56         int mid=(first+last)/2;
57         Sort(first,mid);
58         Sort(mid+1,last);
59         mergesort(first,mid,last);
60     }
61 }
62 int main()
63 {
64     int n;
65     while(scanf("%d",&n)!=EOF)
66     {
67         num=0;
68         for(int i=0; i<n; i++)
69             scanf("%d",&high[i]);
70         Sort(0,n-1);
71         for(int i=0; i<n; i++)
72         {
73             printf("%d ",angry[i]);
74         }
75         cout<<endl;
76         cout<<num<<endl;
77     }
78 
79     return 0;
80 }
View Code

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。