2016-03-15 19 views
3

给定数字列表,您将按照非递减的 顺序对它们进行排序。输入CodeChef TurboSort(使用int对整数进行排序)

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

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

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

使用文字INT值,并使用该排序使用快速排序的文字的Arrays.sort()函数首先执行ALGO(最坏的情况下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文字作为整型对象,并使用Arrays.sort()甲基OD,现在排序使用归并ALGO,保证nlogn性能

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()); 
    } 

} 

然而现在的问题是,按照逻辑,归并ALGO(即,整数对象排序实现)应该采取小于或等于时间的整数对象与IE浏览器中的int文字排序实现对于快速排序算法中)正在采取较小的时间...

Integer对象分类实施 - 0.94sec INT文字排序执行 - 0.53sec

我错过了什么吗? 这个多余的时间是什么原因? 是不是因为自动装箱和autounboxing的?!是这个剩余时间的原因...

+1

顺便说一句,你知道你的元素是整数且<10^6,你可以用线性复杂度对其进行排序。 –

+0

可能是因为你没有测量你认为你正在测量的东西。您可能正在测量HotSpot编译时间,JVM启动时间,磁盘吞吐量等。请先阅读本文,然后发布新的基准测试结果:http://stackoverflow.com/questions/504103/how-do-i-write -a-correct-micro-benchmark-in-java –

回答

0

我想你谢谢你提醒我,我有一个很久以前就被遗忘的codechef账户。这里是我当时所做的解决方案,它花了我20秒来运行代码有点大希望你发现这很有感谢..

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.PrintStream; 
import java.lang.reflect.Field; 
import java.nio.ByteBuffer; 
import java.nio.channels.FileChannel; 

class Reader 
{ 
    private static final int BUFSIZE = 0x10000; 
    private final byte[]  buffer = new byte[BUFSIZE]; 
    private final ByteBuffer bb  = ByteBuffer.wrap(buffer); 
    private final FileChannel channel; 

    int      bufSize = -1;      // non empty buffer 
    int      bufOffset = 0;      // non valid buffer 

    private FileInputStream getFileInputStream(InputStream in) 
    { 
     try 
     { 
      if (in instanceof BufferedInputStream) 
      { 
       Field field = in.getClass().getSuperclass().getDeclaredField("in"); 
       field.setAccessible(true); 
       return (FileInputStream) field.get(in); 
      } 
     } 
     catch (Throwable e) 
     { 
      e.printStackTrace(); 
     } 
     return (FileInputStream) in; 
    } 

    Reader(InputStream in) throws IOException 
    { 
     this.channel = this.getFileInputStream(in).getChannel(); 
    } 

    void fetchBuffer() throws IOException 
    { 
     bb.clear(); 
     bufSize = channel.read(bb); 
     bufOffset = 0; 
    } 

    boolean isFinished() 
    { 
     return bufSize <= 0; 
    } 

    private int peek() throws IOException 
    { 
     if (bufOffset < bufSize) 
      return buffer[bufOffset]; 
     fetchBuffer(); 
     if (bufSize > 0) 
      return buffer[0]; 
     return -1; 
    } 

    private void skipSpace() throws IOException 
    { 
     int v = peek(); 
     while (v <= ' ' && v != -1) 
     { 
      bufOffset++; 
      v = peek(); 
     } 
    } 

    void nextLine() throws IOException 
    { 
     int v = peek(); 
     while (v != -1 && v != '\n' && v != '\r') 
     { 
      bufOffset++; 
      v = peek(); 
     } 
     if (v == '\r') 
     { 
      bufOffset++; 
      v = peek(); 
      if (v == '\n') 
       bufOffset++; 
     } 
     else if (v == '\n') 
     { 
      bufOffset++; 
      v = peek(); 
      if (v == '\r') 
       bufOffset++; 
     } 
    } 

    int readInt() throws IOException 
    { 
     skipSpace(); 
     int result = 0; 
     int v = peek(); 
     while (v > ' ') 
     { 
      result = result * 10 + v - '0'; 
      bufOffset++; 
      v = peek(); 
     } 
     return result; 
    } 

} 

class Writer 
{ 
    private static final int  BUFSIZE = 0x10000; 
    private final FileOutputStream fos; 
    private final byte[]   buffer = new byte[BUFSIZE]; 
    private int     offset = 0; 

    private FileOutputStream getFileOutputStream(PrintStream out) 
    { 
     try 
     { 
      Field field = out.getClass().getSuperclass().getDeclaredField("out"); 
      field.setAccessible(true); 
      OutputStream os = (OutputStream) field.get(out); 
      if (os instanceof BufferedOutputStream) 
      { 
       BufferedOutputStream bos = (BufferedOutputStream) os; 
       field = bos.getClass().getSuperclass().getDeclaredField("out"); 
       field.setAccessible(true); 
       return (FileOutputStream) field.get(bos); 
      } 
      return (FileOutputStream) field.get(out); 
     } 
     catch (Throwable e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    Writer(PrintStream out) throws IOException 
    { 
     fos = getFileOutputStream(out); 
    } 

    private static final int[] boundaries = new int[] 
    { 
     9, 99, 999, 9999, 99999, 999999, 9999999, 
     99999999, 999999999 
    }; 
    private static final int[] divs  = new int[] 
    { 
     1, 10, 100, 1000, 10000, 100000, 1000000, 
     10000000, 100000000 
    }; 
    private static final byte[] numbers = "".getBytes(); 

    void writeln(int number) throws IOException 
    { 
     if (offset > BUFSIZE - 100) 
      flush(); 
     int index; 
     for (index = 0; index < boundaries.length; index++) 
      if (number <= boundaries[index]) 
       break; 
     for (; index >= 0; index--) 
     { 
      int mult = number/divs[index]; 
      buffer[offset++] = numbers[mult]; 
      number -= mult * divs[index]; 
     } 
     buffer[offset++] = '\n'; 
    } 

    void flush() throws IOException 
    { 
     if (offset > 0) 
     { 
      fos.write(buffer, 0, offset); 
      offset = 0; 
     } 
    } 
} 



class Solution { 

    public static void main(String[] args) throws java.lang.Exception { 
     Reader r=new Reader(System.in); 
     Writer w=new Writer(System.out); 

     int x,k; 
     int[] arr2 = new int[1000000]; 
     x = r.readInt(); 
     for (int i = 0; i < x; i++) { 
      arr2[r.readInt()]++; 
     } 
     for (int i = 0; i < 1000000; i++) { 

       k= arr2[i]; 
       while(k-- > 0){ 
        w.writeln(i); 
       } 


     } 
     w.flush(); 
    } 
} 
+0

对不起.21秒运行.. – SmashCode

+0

整数是对象,它通常需要很长时间来处理。 – SmashCode

+0

哇......这是抽象的,因为难以理解......(我是一个新手)所以,如果你能解释这里发生的事情,那将是很好的一种情况.....否则我只会诉诸随机谷歌搜索一如既往,并希望我了解此代码..谢谢! – Vonn

1

对于初学者来说,都归并排序和快速排序在实践中也有类似表现。事实上,快速排序通常比随机数据稍微好一些。但即使合并排序略好一些,排序整数总是会明显变慢,因为排序对象比基元更难。它们不适用于缓存以及原语。

1

排序需要更长的时间,主要是因为使用整数,您正在存储一个对象,这是一个很大的开销。

相关问题