至于规律,你可以发现每次归并过程中,当且仅当右侧的数提前放到左侧,而左侧还未放置的个数就是该元素减少的逆序个数! 这个需要消化一下,而在代码实现中,需要这样进行即可!
int value;------
-----
------
private static void merge(int[] array, int l, int mid, int r) {
int lindex=l;int rindex=mid+1;
int team[]=new int[r-l+1];
int teamindex=0;
while (lindex<=mid&&rindex<=r) {
if(array[lindex]<=array[rindex])
{
team[teamindex++]=array[lindex++];
}
else {
team[teamindex++]=array[rindex++];
value+=mid-lindex+1;//加上左侧还剩余的
}
}
while(lindex<=mid)
{
team[teamindex++]=array[lindex++];
}
while(rindex<=r)
{
team[teamindex++]=array[rindex++];
}
for(int i=0;i<teamindex;i++)
{
array[l+i]=team[i];
}
}
结语
至于归并排序和逆序数就讲这么多了!个人感觉已经尽力讲了,如果有错误或者不好的地方还请各位指正。如果感觉可以,还请点赞,关注一波哈。
欢迎关注公众号:bigsai 长期奋战输出!