第一种方法将数组遍历一遍 一次比较,如果数组有n个元素,那么需要比较(1+n)*n/2次
第二种是利用归并排序算的
//归并排序
#include<iostream>
using namespace std;
int count=0;
const int LENGTH=100;
int temp[LENGTH]; //额外的辅助数组
void MergeArray(int arr[],int start,int middle,int end)
{
int i=start;
int j=middle+1;
int k=0;
while(i<=middle&&j<=end)
{
if(arr[i]<=arr[j])
{
temp[k++]=arr[i++];
} else{
temp[k++]=arr[j++];
<span style="background-color: rgb(255, 0, 0);">count+=middle-i+1;//这一句是关键</span>
}
}
while(i<=middle){
temp[k++]=arr[i++];
}
while(j<=end){
temp[k++]=arr[j++];
}
//将临时数组的元素重新复制给原始数组的制定位置
for(i=0;i<k;i++)
{
arr[start+i]=temp[i];
}
}
void MSort(int *array,int start,int end)
{
if(start==end)
{
return;
}
int middle=(start+end)/2;
MSort(array,start,middle);
MSort(array,middle+1,end);
MergeArray(array,start,middle,end);
}
void printArray(int arr[],int len)
{
for(int i=0;i<len;i++)
{
cout<<arr[i]<<' '<<endl;
}
}
int main()
{
int arr[]={5,4,3,2,1};
int len=sizeof(arr)/sizeof(int);
MSort(arr,0,len-1);
printf("逆序对的对数是:%d",count);
printArray(arr,len);
}
这个方法是在参考了一个文章之后写的 网址忘记了
本文介绍了一种通过归并排序计算数组中逆序对数量的方法,详细解释了算法原理,并提供了代码实现。通过分析归并排序过程中的关键步骤,我们能够准确地计算出给定数组中的逆序对总数。
628

被折叠的 条评论
为什么被折叠?



