问题:一个无序序列,找出其中的逆序对。要求时间复杂度为O (nlogn).关于对于一个包含N个非负整数的数组A[1…n],如果有i< j,且A[i]>A[j],则(A[i], A[j])
例如,数组(3.1,4,5,2)的逆序对有(3,1).(3,.2).(4,2).(5.2),共4个。
语言:c语言
平台:code::block、windows
代码:
int main()
{
int arr[maxsize]={3,1,4,5,2};
int low = 0, high = 4;
MergeSort(arr, low, high);
printf("排序后:");
for(int i=0;i<5;i++)
{
printf("%d ", arr[i]);
}
}
void MergeSort(int arr[], int low, int high)
{
if(low<high)
{
int mid = (high+low)/2;
MergeSort(arr, low, mid);
MergeSort(arr, mid+1, high);
Merge(arr, low, mid, high);
}
}
void Merge(int arr[],int low, int mid, int high)
{
int B[maxsize];
int i,j,k;
for(i=low;i<=high;i++)
{
B[i] = arr[i];
}
for(i=low, j=mid+1, k=low; i<=mid && j<=high;k++)
{
if(B[i]<=B[j])
{
arr[k] = B[i++];
}
else
{
for(int m=i;m<=mid;m++)
{
printf("逆序对:(%d, %d)\n", B[m], B[j]);
}
arr[k] = B[j++];
}
}
while(i<=mid)
{
arr[k++] = B[i++];
}
while(j<=high)
{
arr[k++] = B[j++];
}
}
因为是对数据操作,而且是nlog(n), 很容易联想到关于数据结构中排序的知识。
则只有希尔、归并、快排序、堆排序,因为需要保持每一组操作后,剩下的相对位置不能变化,所以只有归并排序合适,因为它是自下而上的,在每一层中它的那一块都是排序好的(结果已经输出了),而块与块的相对位置也没有变。正好。
一开始只想到了快排,但操作来操作去都解决不了位置的问题。