归并排序如何求逆序数?
下面是小弟的归并排序代码,虽然有点乱但是很浅显易懂:)
然后想求出逆序数,该怎么弄呢?多谢高人指点啊!
#include<iostream>
using namespace std;
int numbers[5];
int temp[5];
int count;
void merge(int start,int end)
{
int mid=(end+start)/2+1;
int p1=start;
int p2=mid;
int count=0;
int begin1=p1;
int begin2=p2;
while(p1<mid && p2<=end)
{
if(numbers[p1]<=numbers[p2])
{
temp[count++]=numbers[p1++];
}
else
temp[count++]=numbers[p2++];
}
if(p1==mid)
{
for(int i=p2;i<=end;i++)
temp[count++]=numbers[i];
}
else
{
for(int i=p1;i<mid;i++)
{
temp[count++]=numbers[i];
}
}
count=0;
for(int i=start;i<=end;i++)
{
numbers[i]=temp[count++];
}
}
void merge_sort(int start,int end)
{
if(start<end)
{
int mid=(end+start)/2;
merge_sort(start,mid);
merge_sort(mid+1,end);
merge(start,end);
}
}
int main(void)
{
int n;
while(true)
{
cin>>n;
if(n==0)
break;
for(int i=0;i<n;i++)
{
cin>>numbers[i];
}
merge_sort(0,n-1);
}
return 0;
}
[解决办法]
[code=c][/code]
[解决办法]
提供思路:
1.设一个全局变量count=0,每merge一次,说明交换位置了,count+1;
2.另一种方法是将merge和merge_sort返回类型改成int,即把过程中的交换次数返回回来。
#include<iostream>
using namespace std;
int numbers[5];
int temp[5];
int count;
int aa=0;
void merge(int start,int end)
{
int mid=(end+start)/2+1;
int p1=start;
int p2=mid;
int count=0;
int begin1=p1;
int begin2=p2;
while(p1<mid && p2<=end)
{
if(numbers[p1]<=numbers[p2])
{
temp[count++]=numbers[p1++];
}
else
{
temp[count++]=numbers[p2++];
aa++;
}
}
if(p1==mid)
{
for(int i=p2;i<=end;i++)
temp[count++]=numbers[i];
}
else
{
for(int i=p1;i<mid;i++)
{
temp[count++]=numbers[i];
}
}
count=0;
for(int i=start;i<=end;i++)
{
numbers[i]=temp[count++];
}
}
void merge_sort(int start,int end)
{
if(start<end)
{
int mid=(end+start)/2;
merge_sort(start,mid);
merge_sort(mid+1,end);
merge(start,end);
}
}
int main(void)
{
int n;
while(true)
{
cin>>n;
if(n==0)
break;
for(int i=0;i<n;i++)
{
cin>>numbers[i];
}
aa=0;
merge_sort(0,n-1);
for(i=0;i<n;i++)
printf("%i,",numbers[i]);
printf("\n%i\n",aa);
}
return 0;
}