On Monday, 31 October 2016 at 20:20:09 UTC, Meta wrote:
[...]

You can't use an un-instantiated template as a type anyway, unlike Java. There the above is illegal because of `BubbleSort b = ...`. The symbol BubbleSort by itself is not a type; you have to instantiate it with template arguments to create a type. So you *could* do it like this:

BubbleSort!(typeof(arr)) b = new BubbleSort!(typeof(arr));

But that's too verbose. There's need need to repeat ourselves. You can instead use `auto` and omit the type of `b`, which will be inferred from the right hand side:

auto b = new BubbleSort!(typeof(arr));

Thanks! This compiled just fine...

[code]
import std.random;
import std.stdio;

void main()
{
    immutable uint N = 10_000;

    double[] arr = new double[](N);
    for (uint k = 0; k < N; k++) arr[k] = uniform(0, N);

    auto b = new BubbleSort!(typeof(arr));
    b.Sort(arr);
}

public class BubbleSort(T)
{
    private T[] a;
    private uint n;

    public void Sort(T)(T[] a) {
        n = a.length;
        bubblesort();
    }

    private void bubblesort() {
        bool sorted;

        do {
            sorted = true;
            for (uint k = 1; k < n; k++) {
                if (a[k-1] > a[k]) {
                    T tmp = a[k];
                    a[k] = a[k+1];
                    a[k+1] = tmp;
                    sorted = false;
                }
            }
            n--;
        } while (!sorted);
    }
}
[/code]

It gives a Range Violation upon executing, but I guess it's part of the algorithm....

Reply via email to