归并排序求逆序对

作者: Taoyongpan | 来源:发表于2018-03-27 11:32 被阅读18次

归并排序

归并排序是我们最常使用的排序算法之一,作用是将两个或两个以上的有序数组合并成为一个新的数组,主要使用的是分治和递归的思想;

步骤

将数组分为等长的两部分,然后合并成一个新的数组,照这个思想对两半部分分别进行递归,即可;

代码
/**
 * @Author: Taoyongpan
 * @Date: Created in 10:11 2018/3/27
 */
public class InversePairsMain {
    private static int count = 0;
    public static void main(String[] args){
        int[] arr = {1,2,3,4,5,6,7,0};
//        System.out.println(InversePairs(arr));
        InversePairs(arr);
        for (int i = 0 ; i< arr.length;i++)
            System.out.println(arr[i]);
    }

    public static void InversePairs(int [] arr) {
        if (arr==null||arr.length<1){
            return;
        }
        mergeSort(arr,0,arr.length-1);
//        return count%1000000007;
    }
    public static void mergeSort(int[] arr,int left,int right){
        if (left >= right){
            return;
        }
        int mid = left+((right-left)>>1);
        mergeSort(arr,left,mid);
        mergeSort(arr,mid+1,right);
        merge(arr,left,right,mid);
    }
    public static void merge(int[] arr,int left,int right,int mid){
        int[] temp = new int[right-left+1];
        int i = left;
        int j = mid+1;
        int n = 0;
        while (i<=mid&&j<=right){
            if (arr[i]<=arr[j]){
                temp[n++] = arr[i++];
            }else {
//                count+=mid+1-i;
                temp[n++] = arr[j++];
            }
        }
        while (i<=mid){
            temp[n++] = arr[i++];
        }
        while (j<=right){
//            count+=mid+1-i;
            temp[n++] = arr[j++];
//            if (count>=1000000007)
//                count%=1000000007;
        }
        for (int t = 0 ; t < temp.length;t++){
            arr[left+t] = temp[t];
        }
    }
}

归并排序的用途

使用归并排序可以求逆数对问题;直接上代码,根据代码讲解问题:

/**
 * @Author: Taoyongpan
 * @Date: Created in 10:11 2018/3/27
 */
public class InversePairsMain {
    private static int count = 0;
    public static void main(String[] args){
        int[] arr = {1,2,3,4,5,6,7,0};
        System.out.println(InversePairs(arr));
    }

    public static int InversePairs(int [] arr) {
        if (arr==null||arr.length<1){
            return 0;
        }
        mergeSort(arr,0,arr.length-1);
        return count;
    }
    public static void mergeSort(int[] arr,int left,int right){
        if (left >= right){
            return;
        }
        int mid = left+((right-left)>>1);
        mergeSort(arr,left,mid);
        mergeSort(arr,mid+1,right);
        merge(arr,left,right,mid);
    }
    public static void merge(int[] arr,int left,int right,int mid){
        int[] temp = new int[right-left+1];
        int i = left;
        int j = mid+1;
        int n = 0;
        while (i<=mid&&j<=right){
            if (arr[i]<=arr[j]){
                temp[n++] = arr[i++];
            }else {
                count+=mid+1-i;
                temp[n++] = arr[j++];
            }
        }
        while (i<=mid){
            temp[n++] = arr[i++];
        }
        while (j<=right){
            count+=mid+1-i;
            temp[n++] = arr[j++];
        }
        for (int t = 0 ; t < temp.length;t++){
            arr[left+t] = temp[t];
        }
    }
}

我们求逆数对个数的时候,知识在两个有序数组合并的过程中,当arr[i]>arr[j]的时候会产生逆数对,此时说明,这个有序数组从i位置开始后面的数都大于arr[j],此时产生mid-i+1个逆数对,当数组合并完成的时候,就能统计出整个数组包含的逆数对个数;

相关文章

  • 排序算法

    常考排序 快速排序 归并排序 归并排序求逆序数对 堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法。 堆积...

  • 归并排序求逆序对

    归并排序 归并排序是我们最常使用的排序算法之一,作用是将两个或两个以上的有序数组合并成为一个新的数组,主要使用的是...

  • ologn排序算法后的两个问题

    求一个数组的逆序数对的个数(归并排序) 求出nums里第k小的数(快速排序)

  • 二分(三分)

    题目链接:二分·归并排序之逆序对 题目链接:三分·三分求极值

  • Chapter6——基础算法——排序

    1. 题目列表 POJ2388(排序,水题) POJ2299(求逆序对,归并排序、树状数组、线段树) 2. PO...

  • POJ 1804

    POJ 1804 题意 求逆序数 思路 在网上看到可以用归并排序,由于数据较小,可以直接求。

  • 2018-03-16

    碰到的算法并查集逆序对归并排序分治算法

  • 05-28:新刷算法题

    1、归并排序 数组逆序对的参考思路: https://zhuanlan.zhihu.com/p/107280674...

  • ACM归并排序求逆序对-火柴排队

    http://codevs.cn/problem/3286/这里引用ssoj官网题解:贪心+逆序对。分析如下:对距...

  • 数组排序问题(一)

    目录 冒泡排序 选择排序 插入排序 归并排序 小和问题 逆序对问题 冒泡排序 冒泡排序的思路:每一个数与自己后面的...

网友评论

  • 逍遥键客:JAVA高级开发群:647355916 大量学习资料和项目实战视频尽情领取

本文标题:归并排序求逆序对

本文链接:https://www.haomeiwen.com/subject/wvmjcftx.html