CodeChef TurboSort(使用int vs Integer排序)

时间:2016-03-15 12:54:00

标签: java arrays sorting mergesort

  

鉴于数字列表,您要对它们进行非递减排序   订购。输入

     

t - 列表中的数字数,然后t行跟随[t <= 10 ^ 6]。   每行包含一个整数:N [0 <= N <= 10 ^ 6]输出

     

以非递减顺序输出给定数字。实施例

     

输入:5 5 3 6 7 1输出:1 3 5 6 7

首先使用文字int值并使用Arrays.sort()函数实现,该函数使用Quicksort算法对文字进行排序(最差情况n ^ 2,平均情况 - nlogn)

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

  public static void main(String[] args) {

    InputStream inputStream = System.in;
    OutputStream outputStream = System.out;
    InputReader in = new InputReader(inputStream);
    PrintWriter out = new PrintWriter(outputStream);

    int num = in.nextInt();

    int[] n = new int[num];

    for (int i = 0; i < n.length; i++) {

      n[i] = in.nextInt();

    }

    Arrays.sort(n);


    for (int i = 0; i < n.length; i++) out.println(n[i]);


    out.close();

  }
}


class InputReader {
  private BufferedReader reader;
  private StringTokenizer tokenizer;

  public InputReader(InputStream stream) {
    reader = new BufferedReader(new InputStreamReader(stream));
    tokenizer = null;
  }

  public String next() {
    while (tokenizer == null || !tokenizer.hasMoreTokens()) {
      try {
        tokenizer = new StringTokenizer(reader.readLine());
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
    }
    return tokenizer.nextToken();
  }

  public int nextInt() {
    return Integer.parseInt(next());
  }

} 

下一个实现是将int文字存储和排序为Integer对象,并使用Arrays.sort()方法,该方法现在使用保证nlogn性能的MergeSort算法对Integer对象进行排序

import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
import java.io.InputStream;

/* Name of the class has to be "Main" only if the class is public. */
class Codechef {
  public static void main(String[] args) {
    InputStream inputStream = System.in;
    OutputStream outputStream = System.out;
    InputReader in = new InputReader(inputStream);
    PrintWriter out = new PrintWriter(outputStream);
    int T = in.nextInt();

    Integer[] ARR = new Integer[T];

    for (int i = 0; i < T; i++) ARR[i] = in.nextInt();

    Arrays.sort(ARR);

    for (int i : ARR) out.println(i);

    out.close();
  }

}

class InputReader {
  private BufferedReader reader;
  private StringTokenizer tokenizer;

  public InputReader(InputStream stream) {
    reader = new BufferedReader(new InputStreamReader(stream));
    tokenizer = null;
  }

  public String next() {
    while (tokenizer == null || !tokenizer.hasMoreTokens()) {
      try {
        tokenizer = new StringTokenizer(reader.readLine());
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
    }
    return tokenizer.nextToken();
  }

  public int nextInt() {
    return Integer.parseInt(next());
  }

} 

然而现在的问题是,根据逻辑,mergesort算法(即整数对象排序实现)相对于Quicksort算法应该花费更少或相等的时间),即int文字排序实现花费更少的时间......

整数对象排序实现 - 0.94秒 int literal排序实现 - 0.53sec

我错过了什么吗? 超时的原因是什么? 是因为自动装箱和自动装箱?这就是造成这段时间的原因......

3 个答案:

答案 0 :(得分:1)

对于初学者来说,实践中的合并排序和快速排序都具有相似的性能。事实上,快速排序通常会略微优于随机数据。但即使合并排序稍好一些,排序整数总是会明显变慢,因为排序对象比基元更难。他们不使用您的缓存和原语。

答案 1 :(得分:1)

排序需要更长的时间主要是因为使用Integer,你存储了一个对象,这是一个很大的开销。

答案 2 :(得分:0)

我想感谢你提醒我,我有一个我已经倾倒了很久的codechef帐户。这是我当时做的解决方案花了我20秒才能运行代码有点大希望你找到这个有用的谢谢..

'-4x^2'