Cod sursa(job #2290800)

Utilizator stoianmihailStoian Mihail stoianmihail Data 27 noiembrie 2018 00:00:52
Problema Sortare prin comparare Scor 40
Compilator java Status done
Runda Arhiva educationala Marime 2.35 kb
import java.io.*;
import java.util.*;

public class Main {
  private static int min(int x, int y) {
    return (x < y) ? x : y;
  }

  public static void main(String[] args) throws Exception {
    InputStream inputStream = new FileInputStream("algsort.in");
    OutputStream outputStream = new FileOutputStream("algsort.out");

    try (InputReader inputReader = new InputReader(inputStream);
      PrintWriter printWriter = new PrintWriter(outputStream)) {

      int n = inputReader.nextInt();
      int[] a = new int[n];

      for (int i = 0; i < n; i++) {
        a[i] = inputReader.nextInt();
      }

      int[] copy = new int[n];

      for (int i = 0; (1 << i) <= n; i++) {
        int j = 0, pow = 1 << (i + 1);
        boolean flag = true;
        while (j < n && flag) {
          if (j + (pow >> 1) >= n) {
            flag = false;
          } else {
            int u = j;
            int v = j + (pow >> 1);
            int p = v;
            int q = min(j + pow, n);
            int k = 0;

            while (u < p && v < q) {
              copy[k++] = (a[u] < a[v]) ? a[u++] : a[v++];
            }
            while (u < p) {
              copy[k++] = a[u++];
            }
            while (v < q) {
              copy[k++] = a[v++];
            }
            for (u = 0; u < k; u++) {
              a[j + u] = copy[u];
            }
          }
          j += pow;
        }
      }
      for (int i = 0; i < n; i++) {
        printWriter.print(a[i] + " ");
      }
    }
  }

  static class InputReader implements AutoCloseable {
    private BufferedReader bufferedReader;
    private StringTokenizer stringTokenizer;

    public InputReader(InputStream inputStream) {
      bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
      stringTokenizer = null;
    }

    private String nextToken() {
      if (stringTokenizer == null || !stringTokenizer.hasMoreTokens()) {
        try {
          stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        } catch (IOException e) {
          throw new RuntimeException(e);
        }
      }
      return stringTokenizer.nextToken();
    }

    public int nextInt() {
      return Integer.parseInt(nextToken());
    }
    @Override
    public void close() throws Exception {
      bufferedReader.close();
    }
  }
}