A few range questions

Charles Smith via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jan 5 10:47:30 PST 2016


Hi,

I'm trying to implement counting sort with ranges; however, hit a 
roadblock here while testing. I'm using the following code:

     int[1_000_000] arr;

     void main() {
         import std.conv : to;
         import std.datetime;
         import std.random;
         import std.stdio;

         for(int i; i < arr.length; ++i)
             arr[i] = uniform(0, 1000);

         auto benchmarks = benchmark!(algorithmSort, 
countingSort)(1);

         writeln("Agorithm's Sort: ", to!Duration(benchmarks[0]));
         writeln("Counting Sort: ", to!Duration(benchmarks[1]));
     }

     void algorithmSort() {
         import std.algorithm : sort;

         auto result = arr[].sort;
     }

     void countingSort() {
         import std.algorithm : count, map;
         import std.range : array, chain, iota, repeat;

         auto result = 1_000.iota.map!(a => a.repeat(count(arr[], 
a))).chain.array;
     }

1. `arr[].sort` is changing arr in place. Any way to not do that?
2. I noticed that result within `countingSort` is an array of 
arrays. I thought `chain` would concat them... did I miss 
something obvious?
3. It's kind of hard to compare performance because of (1), but 
is there a better way to do this?


More information about the Digitalmars-d-learn mailing list