Poj 2299

来源:互联网 发布:mysql replace函数 编辑:程序博客网 时间:2024/05/22 02:16

求逆序数,合并排序的简单应用,经验不足,把简单问题复杂化,把堆排序整出来了,各种RE,不知道为啥,百度一下,写了合并排序过了

~

 

实践证明,Scanner慢的很,用BufferedReader从 2750ms降到688ms.

 

package june;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Poj2299 {

    public static void main(String[] args) throws NumberFormatException,
            IOException {

        BufferedReader s = new BufferedReader(new InputStreamReader(System.in));
        int length;
        int[] in;
        StringBuilder sb = new StringBuilder();
        while (true) {

            length = new Integer(s.readLine());
            if (length == 0)
                break;
            in = new int[length];
            for (int i = 0; i < length; i++)
                in[i] = new Integer(s.readLine());

            mergeSort(in, 0, length - 1);
            sb.append(total);
            sb.append('/n');
            total = 0;
        }
        System.out.println(sb.toString());

    }

    public static void mergeSort(int[] in, int start, int end) {
        int mid;
        if (start < end) {
            mid = (start + end) / 2;
            mergeSort(in, start, mid);
            mergeSort(in, mid + 1, end);
            merge(in, start, mid, end);
        }

    }

    static long total = 0;

    public static void merge(int[] in, int start, int mid, int end) {

        int s1 = start;
        int s2 = mid + 1;
        int e1 = mid;
        int e2 = end;
        int tmp[] = new int[end - start + 1];
        int i = 0;
        while (s1 <= e1 && s2 <= e2) {
            if (in[s1] <= in[s2])
                tmp[i++] = in[s1++];
            else {
                tmp[i++] = in[s2++];
                total = total + e1 - s1 + 1;
            }
        }
        while (s1 <= e1)
            tmp[i++] = in[s1++];

        while (s2 <= e2)
            tmp[i++] = in[s2++];

        for (i = start; i <= end; i++)
            in[i] = tmp[i - start];

    }
}

原创粉丝点击