您的位置:首页 > 其它

利用归并排序求数列中逆序对个数

2010-10-08 01:31 309 查看
参考了这篇文章:http://blog.csdn.net/MapReduce/archive/2007/05/20/1618515.aspx
以前自己写的归并排序比较累赘,文章中的代码更有条理,而且计算逆序对个数只需要一行代码,是否对原数列进行排序也只需要决定是否取舍一行代码。
#include <stdio.h>
#include <stdlib.h>

int ans;

void copy(int a[], int b[], int l, int r)
{
int i = l;
while (i <= r)
{
a[i] = b[i];
i++;
}
}

void merge(int a[], int b[], int l, int m, int r)
{
int i = l, j = m + 1;
while (i <= m && j <= r)
{
if (a[i] <= a[j])
b[l++] = a[i++];
else
{
b[l++] = a[j++];
ans += m - i + 1; // 求逆序对的个数:a[i]到a[m]的每一个数,都会与a[j]构成一个逆序对
}
}

while (i <= m)
b[l++] = a[i++];
while (j <= r)
b[l++] = a[j++];
}

void merge_sort(int a[], int b[], int l, int r)
{
if (l < r)
{
int m = l + (r - l) / 2;
merge_sort(a, b, l, m);
merge_sort(a, b, m + 1, r);
merge(a, b, l, m, r);
copy(a, b, l, r);
}
}

void foo(int a[], int size)
{
int *b = new int[size];
merge_sort(a, b, 0, size - 1);
delete b;
b = NULL;
}

int main()
{
int a[] = {6, 5, 4, 3, 2, 1}, i;
foo(a, sizeof(a) / sizeof(int));

for (i = 0; i < sizeof(a) / sizeof(int); i++)
printf("%d ", a[i]);

printf("/nans = %d/n", ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: