利用归并排序求数组中的逆序对

来源:互联网 发布:怎么自己做软件 编辑:程序博客网 时间:2024/06/07 22:56

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数:

如数组{7,5,6,4},逆序对总共有5对,{7,5},{7,6},{7,4},{5,4},{6,4};

这道题可以采用归并排序的思想来处理:先把数组分成两个子序列,统计左半部分逆序对的数目和右半部分逆序对的数目,然后将两个子序列排序,(避免重复),然后再统计合并在一起时逆序对的数目。加起来就是结果。

例如上面那个例子:先把数组分解成两个长度为2的子数组,再把这两个子数组分解成两个长度为1的子数组。接下来一边合并相邻的子数组,一边统计逆序对的数目。在第一对长度为1的子数组{7}、{5}中7>5,因此(7,5)组成一个逆序对。同样在第二对长度为1的子数组{6},{4}中也有逆序对(6,4),由于已经统计了这两对子数组内部的逆序对,因此需要把这两对子数组进行排序,避免在之后的统计过程中重复统计。

逆序对的总数=左边数组中的逆序对的数量+右边数组中逆序对的数量+左右结合成新的顺序数组时中出现的逆序对的数量;

其实整个过程就是归并排序的思想。

代码如下:

//数组中的逆序对    public static int InversePairs(int[] array){        if(array==null||array.length<=1)            return 0;        int[] copy = new int[array.length];        for(int i=0;i<array.length;i++){            copy[i] = array[i];        }        return mergeCount(array, copy, 0, array.length-1);    }    public static int mergeCount(int[] array, int[] copy, int start, int end){        if(start==end){            copy[start] = array[start];            return 0;        }        int mid = (start+end)>>1;        int leftCount = mergeCount(copy, array, start, mid);        int rightCount = mergeCount(copy, array, mid+1, end);        int i = mid;//i初始化为前半段最后一个数字的下标        int j = end;//j初始化为后半段最后一个数字的下标        int index = end;//辅助数组复制的数组的最后一个数字的下标        int count = 0;//计数--逆序对的数目        while(i>=start&&j>=mid+1){            if(array[i]>array[j]){                copy[index--] = array[i--];                count += j-mid;            }else{                copy[index--] = array[j--];            }        }        for(;i>=start;i--){            copy[index--] = array[i];        }        for(;j>=mid+1;j--){            copy[index--] = array[j];        }        return leftCount+rightCount+count;    }

参考链接:http://www.cnblogs.com/coffy/p/5896541.html

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 慢性肠胃炎犯了怎么办 儿子拉肚肚子疼怎么办 皮肤太容易过敏怎么办 过敏脸一直不好怎么办 脸上突然过敏怎么办急救 脸过敏发红疼怎么办 脸上突然过敏了怎么办 脸过敏总反复怎么办 用蜂蜜洗脸过敏怎么办 脸上涂蜂蜜过敏怎么办 孕晚期脸过敏怎么办 吃芒果脸过敏怎么办 脸上老反复过敏怎么办 用什么都过敏怎么办 脸上起过敏湿疹怎么办 脸上发湿疹过敏怎么办 感冒流鼻涕有痰怎么办 咳嗽流清水鼻涕怎么办 脸最近老是过敏怎么办 鼻炎脸特别疼怎么办 宝宝感冒一直流鼻涕怎么办 经常过敏的体质怎么办 一边鼻子堵了怎么办 鼻炎流清水鼻涕怎么办 鼻子总感觉堵塞怎么办 半边鼻子不通气怎么办 鼻炎感冒了鼻塞怎么办 左边鼻子不通气怎么办 婴儿鼻塞不通气怎么办 过敏性鼻炎一直打喷嚏怎么办 一只鼻子流鼻涕怎么办 一个鼻子不通气怎么办 夏天鼻子堵了怎么办 做完鼻子感冒了怎么办 鼻子不通流鼻涕打喷嚏怎么办 一岁半宝宝流鼻涕鼻塞怎么办 没有感昌流鼻涕怎么办 婴儿感冒咳嗽流鼻涕怎么办 小孩经常流鼻子怎么办 5岁宝宝流鼻涕怎么办 小孩鼻涕一直流怎么办