#include <stdio.h>
#include <string.h>
int s[55];
int main()
{
int n,js,k;
while(~scanf("%d",&k))
{
while(k--)
{
scanf("%d",&n);
for(int i = 0;i < n;i++)
{
scanf("%d",&s[i]);
}
js = 0;
for(int i = 0;i < n - 1;i++)
{
for(int j = 0;j < n - 1 - i;j++)
{
if(s[j] > s[j + 1])
{
int tmp = s[j];
s[j] = s[j + 1];
s[j + 1] = tmp;
js++;
}
}
}
printf("Optimal train swapping takes %d swaps.\n",js);
}
}
return 0;
}
归并排序法:
#include <stdio.h>
#include <string.h>
int a[55];
int s1[30],s2[30];
int sum;
void gbpx(int l,int r,int mid)
{
int len1 = 0,len2 = 0;
for(int i = l; i <= mid; i++)
{
s1[len1++] = a[i];
}
s1[len1] = 1 << 28;
for(int i = mid + 1; i <= r; i++)
{
s2[len2++] = a[i];
}
s2[len2] = 1 << 28;
for(int i = 0,j = 0,k = l; k <= r; k++)
{
if(s1[i] <= s2[j])
a[k] = s1[i++];
else
{
a[k] = s2[j++];
sum += (len1 - i);
}
}
}
void dy(int s,int t)
{
if(s < t)
{
int mid = (s + t) >> 1;
dy(s,mid);
dy(mid + 1,t);
gbpx(s,t,mid);
}
}
int main()
{
int k,n;
while(~scanf("%d",&k))
{
while(k--)
{
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
sum = 0;
dy(0,n - 1);
printf("Optimal train swapping takes %d swaps.\n",sum);
}
}
return 0;
}