本一,初次写博客,如有错误欢迎指正
/*
题目要求是查出左边比右边数字大的sum情况(逆序对)
思路:
运用归并排序思想,其思想每一次左右两大队列,是内部有序的
所以说
例子:
左 右
6 3
7 5
8 7
当右边出门时就证明他比左边指针所在位置要小,而左边是从小到大的
所以说他比左边现存的元素都要小 niuxu+=这些数
不用考虑重复因为每一次递归的话已经是把位置进行了调整
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int nixu=0;
void merge(int a[],int begin,int mid,int end)
{
int result[100];
int k=0;
int i=begin;
int j=mid+1;
while(i<=mid&&j<=end)
{
if(a[i]<a[j])
{
result[k++]=a[i++];
}
else
{
nixu+=mid-i+1;
result[k++]=a[j++];
}
if(i==mid+1)
{
while(j<=end)
{
result[k++]=a[j++];
}
}
if(j==end+1)
{
while(i<=mid)
{
result[k++]=a[i++];
}
}
}
for(j=0,i=begin; j<k; j++,i++)
{
a[i]=result[j];
}
}
void mergeSort(int a[],int begin,int end)
{
if(begin>=end)
return ;
int mid=(begin+end)/2;
mergeSort(a,begin,mid);
mergeSort(a,mid+1,end);
merge(a,begin,mid,end);
}
int main()
{
int a[]= {37,40,48,90,32,5,12,3,44,13};
int end=sizeof(a)/sizeof(a[0])-1;
int begin =0;
mergeSort(a,begin,end);
printf("%d\n",nixu);
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务