您的位置:首页 > 编程语言 > C语言/C++

c语言归并排序(poj2299)《学习记录》

2015-07-22 20:44 477 查看
个人感觉和快排有些类似之处poj2388,这个题是找逆序队
#include <stdio.h>
#include <stdlib.h>
#define MAX 500001
int n, a[MAX], t[MAX];
__int64 sum;
void wp(int l, int m, int r)
{
int p = 0;//计数,复制的时候
int i = l, j = m + 1;
while(i <= m && j <= r)//左右两个数组都有数
{
if (a[i] > a[j])
{
t[p++] = a[j++];
sum+= m - i + 1;//序队可加
}
else
{
t[p++] = a[i++];
}
}
while(i <= m) t[p++] = a[i++];
while(j <= r) t[p++] = a[j++];
for (i = 0; i < p; i++)
{
a[l + i] = t[i];//把结果还原到原来的数组
}
}
void Sort(int l, int r)
{
int m;
if (l < r)
{
m = (l + r) / 2;
Sort(l, m);
Sort(m + 1, r);
wp(l, m, r);
}
}
int main()
{
int i;
while(1)
{
scanf("%d", &n);
if (n == 0) break;
sum=0;
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
Sort(0, n - 1);
printf("%I64d\n", sum);
}
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息