求逆序对个数--归并排序
归并排序想法很简单,和分治有点像 复杂度是 O(nlogn)空间复杂度O(N)
归并排序是稳定排序 在大规模信息处理外排序中用得比较多,如多路归并败者树。
练习手写了下归并排序,犯了n多错,都是很傻得错,下次写代码前一定要想清楚..
int buffer[1024];
int mege(int s[],int st,int e)
{
int n = 0;
if (e-st == 2)
{
if (s[st] > s[e-1])
{
int t = s[st];
s[st] = s[e-1];
s[e-1] = t;
n++;
}
return n;
}
else
{
int mid = st +(e-st)/2;
int i = st,j = mid;
int index = 0;
while (i<mid && j<e )
{
if (s[i] < s[j])
{
buffer[index] = s[i];
i++;
}
else
{
buffer[index] = s[j];
j++;
}
index++;
}
if (i==mid)
{
while (j<e)
{
buffer[index] = s[j];
j++;index++;
}
}
else
{
while (i<mid)
{
buffer[index] = s[i];
i++;index++;
}
}
while(index--)
{
s[--e] = buffer[index];
}
}
return 0;
}
int megersort(int s[],int st,int e)
{
if (e-st ==1)
{
return 0;
}
int mid = st + (e-st)/2;
megersort(s,st,mid);
megersort(s,mid,e);
mege(s,st,e);
}
void main()
{
int s[] = {1 ,2,3,5,5,6,30,8,9,0};
megersort(s,0,10);
for (int i = 0;i<10;i++)
{
cout<<buffer[i]<<" ";
}
cout<<endl;
}
int mege(int s[],int st,int e)
{
int n = 0;
if (e-st == 2)
{
if (s[st] > s[e-1])
{
int t = s[st];
s[st] = s[e-1];
s[e-1] = t;
n++;
}
return n;
}
else
{
int mid = st +(e-st)/2;
int i = st,j = mid;
int index = 0;
while (i<mid && j<e )
{
if (s[i] < s[j])
{
buffer[index] = s[i];
i++;
}
else
{
buffer[index] = s[j];
j++;
}
index++;
}
if (i==mid)
{
while (j<e)
{
buffer[index] = s[j];
j++;index++;
}
}
else
{
while (i<mid)
{
buffer[index] = s[i];
i++;index++;
}
}
while(index--)
{
s[--e] = buffer[index];
}
}
return 0;
}
int megersort(int s[],int st,int e)
{
if (e-st ==1)
{
return 0;
}
int mid = st + (e-st)/2;
megersort(s,st,mid);
megersort(s,mid,e);
mege(s,st,e);
}
void main()
{
int s[] = {1 ,2,3,5,5,6,30,8,9,0};
megersort(s,0,10);
for (int i = 0;i<10;i++)
{
cout<<buffer[i]<<" ";
}
cout<<endl;
}
利用归并排序 我们还可以求逆序对的个数。
如果定义从小到大是正序的话, 所谓逆序对就是指,在数组中s[i]>s[j] 其中 i<j 的对数的个数。。
利用归并排序,只需要做一个很小的改动就可以得到:
int buffer[1024];
int mege(int s[],int st,int e)
{
int n = 0;
if (e-st == 2)
{
if (s[st] > s[e-1])
{
int t = s[st];
s[st] = s[e-1];
s[e-1] = t;
n++;
}
return n;
}
else
{
int mid = st +(e-st)/2;
int i = st,j = mid;
int index = 0;
while (i<mid && j<e )
{
if (s[i] <= s[j])
{
buffer[index] = s[i];
i++;
}
else
{
buffer[index] = s[j];
j++;
n = n + mid -i;
}
index++;
}
if (i==mid)
{
while (j<e)
{
buffer[index] = s[j];
j++;index++;
}
}
else
{
while (i<mid)
{
buffer[index] = s[i];
i++;index++;
}
}
while(index--)
{
s[--e] = buffer[index];
}
}
return n;
}
int megersort(int s[],int st,int e)
{
if (e-st ==1)
{
return 0;
}
int mid = st + (e-st)/2;
int a = megersort(s,st,mid);
int b = megersort(s,mid,e);
return a+b + mege(s,st,e) ;
}
void main()
{
int s[] = {1 ,2,3,5,5,6,30,8,9,0};
cout<<megersort(s,0,10)<<endl;
for (int i = 0;i<10;i++)
{
cout<<buffer[i]<<" ";
}
cout<<endl;
}
int mege(int s[],int st,int e)
{
int n = 0;
if (e-st == 2)
{
if (s[st] > s[e-1])
{
int t = s[st];
s[st] = s[e-1];
s[e-1] = t;
n++;
}
return n;
}
else
{
int mid = st +(e-st)/2;
int i = st,j = mid;
int index = 0;
while (i<mid && j<e )
{
if (s[i] <= s[j])
{
buffer[index] = s[i];
i++;
}
else
{
buffer[index] = s[j];
j++;
n = n + mid -i;
}
index++;
}
if (i==mid)
{
while (j<e)
{
buffer[index] = s[j];
j++;index++;
}
}
else
{
while (i<mid)
{
buffer[index] = s[i];
i++;index++;
}
}
while(index--)
{
s[--e] = buffer[index];
}
}
return n;
}
int megersort(int s[],int st,int e)
{
if (e-st ==1)
{
return 0;
}
int mid = st + (e-st)/2;
int a = megersort(s,st,mid);
int b = megersort(s,mid,e);
return a+b + mege(s,st,e) ;
}
void main()
{
int s[] = {1 ,2,3,5,5,6,30,8,9,0};
cout<<megersort(s,0,10)<<endl;
for (int i = 0;i<10;i++)
{
cout<<buffer[i]<<" ";
}
cout<<endl;
}