求逆序数,合并排序的简单应用,经验不足,把简单问题复杂化,把堆排序整出来了,各种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];
}
}