归并排序(逆序数问题)详解 (3)

至于规律,你可以发现每次归并过程中,当且仅当右侧的数提前放到左侧,而左侧还未放置的个数就是该元素减少的逆序个数! 这个需要消化一下,而在代码实现中,需要这样进行即可!

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 长期奋战输出!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggpdy.html