Skip to content

Commit 3cbdba9

Browse files
committed
Dlang merge sort implementation.
How to test: `dmd mergesort.d mergesort_test.d -w -unittest -release && ./mergesort 1000000` If you want to track array state on each step compile with -debug flag.
1 parent 4cf02d3 commit 3cbdba9

2 files changed

Lines changed: 92 additions & 0 deletions

File tree

Merge_Sort/D/3Hren/mergesort.d

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
module mergesort;
2+
3+
import std.stdio;
4+
5+
pure bool isSorted(T)(T[] data) {
6+
for (int i = 0; i < data.length - 1; ++i) {
7+
if (data[i] > data[i + 1]) {
8+
return false;
9+
}
10+
}
11+
12+
return true;
13+
}
14+
15+
unittest {
16+
int[] data = [5, 4, 2, 6, 2, 9, 5, 2, 0, 2, 9, 7];
17+
mergeSort(data);
18+
assert(isSorted(data));
19+
}
20+
21+
public pure void mergeSort(T)(T[] data) {
22+
T[] aux = new T[data.length];
23+
mergeSort(data, aux);
24+
}
25+
26+
private pure void mergeSort(T)(T[] data, T[] aux) {
27+
if (data.length == 1) {
28+
return;
29+
}
30+
31+
mergeSort(data[0..$/2], aux);
32+
mergeSort(data[$/2..$], aux);
33+
merge(data[0..$/2], data[$/2..$], aux);
34+
}
35+
36+
private pure void merge(T)(T[] left, T[] right, T[] aux)
37+
in {
38+
debug { writeln(left, right); }
39+
assert(isSorted(left));
40+
assert(isSorted(right));
41+
} out {
42+
debug { writeln(aux[0..(left.length + right.length)]); }
43+
assert(isSorted(aux[0..(left.length + right.length)]));
44+
} body {
45+
if (left[$ - 1] < right[0]) {
46+
return;
47+
}
48+
49+
immutable ulong size = left.length + right.length;
50+
51+
int i = 0;
52+
int l = 0;
53+
int r = 0;
54+
55+
while (l < left.length && r < right.length) {
56+
if (left[l] < right[r]) {
57+
aux[i++] = left[l++];
58+
} else {
59+
aux[i++] = right[r++];
60+
}
61+
}
62+
63+
if (l == left.length) {
64+
aux[i..size] = right[r..$];
65+
} else {
66+
aux[i..size] = left[l..$];
67+
}
68+
69+
left[] = aux[0..left.length];
70+
right[] = aux[left.length..size];
71+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import std.random;
2+
import std.conv;
3+
import std.stdio;
4+
5+
import mergesort;
6+
7+
int main(string[] args) {
8+
if (args.length != 2) {
9+
writeln("Usage: mergesort N");
10+
return 1;
11+
}
12+
13+
immutable int N = to!int(args[1]);
14+
int[] data = new int[N];
15+
for (int i = 0; i < N; i++) {
16+
data[i] = uniform(0, N);
17+
}
18+
mergeSort(data);
19+
assert(isSorted(data));
20+
return 0;
21+
}

0 commit comments

Comments
 (0)