Skip to main content
edited title
Link
coderodde
  • 32.3k
  • 15
  • 79
  • 205

Order statistics in an unsorted arraywithout sorting in expected linear time in Java

edited title
Link
coderodde
  • 32.3k
  • 15
  • 79
  • 205

Order statistics in an unsorted array in expected linear time in Java

Added the benchmarking code before getting actual reviews.
Source Link
coderodde
  • 32.3k
  • 15
  • 79
  • 205
package net.coderodde.stat;

import java.util.Arrays;
import java.util.Random;

public class Demo {

    private static final int WARMUP_LENGTH = 100_000;
    private static final int WARMUP_ITERATIONS = 500;
    private static final int ARRAY_LENGTH = 50_000_000;

    public static void main(String[] args) {
        long seed = System.currentTimeMillis();
        Random random = new Random(seed);

        warmup(random);

        int[] array = getRandomIntArray(ARRAY_LENGTH, random);
        System.out.println("Seed = " + seed);

        long startTime = System.currentTimeMillis();
        int median1 = OrderStatistics.randomizedSelect(array, ARRAY_LENGTH / 2);
        long endTime = System.currentTimeMillis();

        System.out.println("OrderStatistics.randomizedSelect() in " +
                           (endTime - startTime) + " milliseconds.");

        startTime = System.currentTimeMillis();
        Arrays.sort(array);
        int median2 = array[ARRAY_LENGTH / 2];
        endTime = System.currentTimeMillis();

        System.out.println("Selection via sorting in " + (endTime - startTime) +
                           " milliseconds.");

        if (median1 != median2) {
            System.err.println("Algorithms disagree: " + median1 + " vs. " +
                               median2);
        } else {
            System.out.println("Algorithms agree: " + median1);
        }
    }

    private static void warmup(Random random) {
        System.out.println("Warming up...");

        for (int iteration = 0; iteration < WARMUP_ITERATIONS; ++iteration) {
            int[] array = getRandomIntArray(WARMUP_LENGTH, random);
            OrderStatistics.randomizedSelect(array, 
                                             random.nextInt(WARMUP_LENGTH));
            Arrays.sort(array);
        }

        System.out.println("Warming up done!");
    }

    private static int[] getRandomIntArray(int length, Random random) {
        int[] array = new int[length];

        for (int i = 0; i < array.length; ++i) {
            array[i] = random.nextInt(1_000_000);
        }

        return array;
    }
}
package net.coderodde.stat;

import java.util.Arrays;
import java.util.Random;

public class Demo {

    private static final int ARRAY_LENGTH = 50_000_000;

    public static void main(String[] args) {
        long seed = System.currentTimeMillis();
        Random random = new Random(seed);

        int[] array = getRandomIntArray(ARRAY_LENGTH, random);
        System.out.println("Seed = " + seed);

        long startTime = System.currentTimeMillis();
        int median1 = OrderStatistics.randomizedSelect(array, ARRAY_LENGTH / 2);
        long endTime = System.currentTimeMillis();

        System.out.println("OrderStatistics.randomizedSelect() in " +
                           (endTime - startTime) + " milliseconds.");

        startTime = System.currentTimeMillis();
        Arrays.sort(array);
        int median2 = array[ARRAY_LENGTH / 2];
        endTime = System.currentTimeMillis();

        System.out.println("Selection via sorting in " + (endTime - startTime) +
                           " milliseconds.");

        if (median1 != median2) {
            System.err.println("Algorithms disagree: " + median1 + " vs. " +
                               median2);
        } else {
            System.out.println("Algorithms agree: " + median1);
        }
    }

    private static int[] getRandomIntArray(int length, Random random) {
        int[] array = new int[length];

        for (int i = 0; i < array.length; ++i) {
            array[i] = random.nextInt(1_000_000);
        }

        return array;
    }
}
package net.coderodde.stat;

import java.util.Arrays;
import java.util.Random;

public class Demo {

    private static final int WARMUP_LENGTH = 100_000;
    private static final int WARMUP_ITERATIONS = 500;
    private static final int ARRAY_LENGTH = 50_000_000;

    public static void main(String[] args) {
        long seed = System.currentTimeMillis();
        Random random = new Random(seed);

        warmup(random);

        int[] array = getRandomIntArray(ARRAY_LENGTH, random);
        System.out.println("Seed = " + seed);

        long startTime = System.currentTimeMillis();
        int median1 = OrderStatistics.randomizedSelect(array, ARRAY_LENGTH / 2);
        long endTime = System.currentTimeMillis();

        System.out.println("OrderStatistics.randomizedSelect() in " +
                           (endTime - startTime) + " milliseconds.");

        startTime = System.currentTimeMillis();
        Arrays.sort(array);
        int median2 = array[ARRAY_LENGTH / 2];
        endTime = System.currentTimeMillis();

        System.out.println("Selection via sorting in " + (endTime - startTime) +
                           " milliseconds.");

        if (median1 != median2) {
            System.err.println("Algorithms disagree: " + median1 + " vs. " +
                               median2);
        } else {
            System.out.println("Algorithms agree: " + median1);
        }
    }

    private static void warmup(Random random) {
        System.out.println("Warming up...");

        for (int iteration = 0; iteration < WARMUP_ITERATIONS; ++iteration) {
            int[] array = getRandomIntArray(WARMUP_LENGTH, random);
            OrderStatistics.randomizedSelect(array, 
                                             random.nextInt(WARMUP_LENGTH));
            Arrays.sort(array);
        }

        System.out.println("Warming up done!");
    }

    private static int[] getRandomIntArray(int length, Random random) {
        int[] array = new int[length];

        for (int i = 0; i < array.length; ++i) {
            array[i] = random.nextInt(1_000_000);
        }

        return array;
    }
}
Removed fixed random seed.
Source Link
coderodde
  • 32.3k
  • 15
  • 79
  • 205
Loading
Source Link
coderodde
  • 32.3k
  • 15
  • 79
  • 205
Loading