码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序求逆序数对。

时间:2015-04-03 23:45:54      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
 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

 

归并排序求逆序数对。

标签:

原文地址:http://www.cnblogs.com/XMJQVRWSD/p/4391245.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!