最少的交换

Posted qing123tian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最少的交换相关的知识,希望对你有一定的参考价值。

最少的交换

题目描述

现在给你一个由n个互不相同的整数组成的序列,现在要求你任意交换相邻的两个数字,使序列成为升序序列,请问最少的交换次数是多少?

输入

输入包含多组测试数据。每组输入第一行是一个正整数n(n<500000),表示序列的长度,当n=0时。
接下来的n行,每行一个整数a[i](0<=a[i]<=999999999),表示序列中第i个元素。

输出

对于每组输入,输出使得所给序列升序的最少交换次数。

样例输入

5
9
1
0
5
4
3
1
2
3
0

样例输出

6
0


技术图片
 1 #include<iostream>
 2 using namespace std;
 3 int x[500050],b[500050];//归并排序过程中累加所有逆序数
 4 long long num;//注意交换次数类型
 5 void Merge(int data[], int low, int mid, int high)
 6 
 7     int i = low, j = mid + 1, k = low;
 8     while (i <= mid && j <= high)
 9     
10         if (data[i] <= data[j])
11             b[k++] = data[i++];
12         else
13         
14             num += j - k;
15             b[k++] = data[j++];
16         
17     
18     while (i <= mid)
19         b[k++] = data[i++];
20     while (j <= high)
21         b[k++] = data[j++];
22     for (i = low; i <= high; i++, k++)
23         data[i] = b[i];
24 
25 void MergeSort(int data[], int low, int high)
26 
27     if (low<high)
28     
29         int mid = (low + high) / 2;
30         MergeSort(data, low, mid);
31         MergeSort(data, mid + 1, high);
32         Merge(data, low, mid, high);
33     
34 
35 
36 int main()
37 
38     int n;
39     while (cin >> n&&n)
40     
41         for (int i = 0; i < n; i++)
42         
43             cin >> x[i];
44         
45         num = 0;
46         MergeSort(x, 0, n - 1);
47         cout << num << endl;
48     
49     return 0;
50 
51 
52 
53 
54 #include<iostream>
55 using namespace std;
56 int a[500010],b[500010];
57 long long int count;
58 void Merge(int start,int mid,int end)
59 
60  int i=start,j=mid+1,tip=start;
61  while(i<=mid&&j<=end)
62  
63   if(a[i]<=a[j]) b[tip++]=a[i++];
64   else
65    count+=(j-tip),b[tip++]=a[j++];
66  
67  while(i<=mid) b[tip++]=a[i++];
68  while(j<=end) b[tip++]=a[j++];
69  for(int i=start;i<=end;i++)
70   a[i]=b[i];
71 
72 void MergeSort(int start,int end)
73 
74  if(start<end)
75  
76   int mid=(start+end)/2;
77   MergeSort(start,mid);
78   MergeSort(mid+1,end);
79   Merge(start,mid,end);
80  
81 
82 int main()
83 
84  int n;
85  while(cin>>n&&n)
86  
87   for(int i=1;i<=n;i++)
88    cin>>a[i];
89   count=0;
90   MergeSort(1,n);
91   cout<<count<<endl;
92  
93  return 0;
94 
View Code

 

以上是关于最少的交换的主要内容,如果未能解决你的问题,请参考以下文章

最少的交换

关于排序中最少交换次数的证明(置换环)

关于排序中最少交换次数的证明(置换环)

交换最少次使数列有序

求问数组从小到大排序最少交换次数的题目怎么做比较好?

最少交换次数