1. 程式人生 > 其它 >JZ35 陣列中的逆序對

JZ35 陣列中的逆序對

JZ35 陣列中的逆序對

原題連結

<br//>

描述

在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007

對於50%50%的資料,size\leq 10^4siz**e≤104
對於100%100%的資料,size\leq 10^5siz**e≤105

示例

輸入:[1,2,3,4,5,6,7,0]
返回值:7

思路

歸併排序。排序的時候操作的是兩個子陣列a,b,遍歷兩個陣列如果發現 a 當前的數大於 b 當前的數,那麼說明a 中該數後面的數都大於 b 中的那個數,以此統計逆序對數。


解答

package com.klaus.sort;

import org.junit.Test;

public class MergeSort {
    int cnt = 0;

    public void merge(int[] a, int low, int high) {
        if (low < high) {
            // int mid = low + (high - low) / 2;
            int mid = (low + high) / 2;
            merge(a, low, mid);
            merge(a, mid + 1, high);
            sort(a, low, high, mid);
        }
    }

    public void sort(int[] a, int low, int high, int mid) {
        int i = low, j = mid + 1;
        int[] tmp = new int[high - low + 1];
        int p = 0;

        // 兩邊相互比較
        while (i <= mid && j <= high) {
            if (a[i] <= a[j]) {
                tmp[p++] = a[i++];
            } else {
                tmp[p++] = a[j++];
                cnt += (mid - i + 1);//就這個!!!
            }
        }

        // 把還沒比較完的直接放入tmp
        while (i <= mid) {
            tmp[p++] = a[i++];
        }
        while (j <= high) {
            tmp[p++] = a[j++];
        }
        p = 0;
        // 這是為什麼要儲存剛剛的 low、high
        for (int t = low; t <= high; t++) {
            a[t] = tmp[p++];
        }
    }

}

本文來自部落格園,作者:klaus08,轉載請註明原文連結:https://www.cnblogs.com/klaus08/p/15208008.html