Skip to content

Commit 9b28c49

Browse files
committed
---
yaml --- r: 1129 b: refs/heads/master c: 6443179 h: refs/heads/master i: 1127: 7fa4a08 v: v3
1 parent 7dabd6b commit 9b28c49

File tree

4 files changed

+101
-1
lines changed

4 files changed

+101
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: b9286a7179c64bcdb1a8207abc302d395ed1c0ac
2+
refs/heads/master: 6443179bcab63c440203a321297d32f5b2a2f8e0

trunk/src/lib/sort.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import _vec.len;
2+
import _vec.slice;
3+
4+
type lteq[T] = fn(&T a, &T b) -> bool;
5+
6+
fn merge_sort[T](lteq[T] le, vec[T] v) -> vec[T] {
7+
8+
fn merge[T](lteq[T] le, vec[T] a, vec[T] b) -> vec[T] {
9+
let vec[T] res = vec();
10+
let uint a_len = len[T](a);
11+
let uint a_ix = 0u;
12+
let uint b_len = len[T](b);
13+
let uint b_ix = 0u;
14+
while (a_ix < a_len && b_ix < b_len) {
15+
if (le(a.(a_ix), b.(b_ix))) {
16+
res += a.(a_ix);
17+
a_ix += 1u;
18+
} else {
19+
res += b.(b_ix);
20+
b_ix += 1u;
21+
}
22+
}
23+
res += slice[T](a, a_ix, a_len);
24+
res += slice[T](b, b_ix, b_len);
25+
ret res;
26+
}
27+
28+
let uint v_len = len[T](v);
29+
30+
if (v_len <= 1u) {
31+
ret v;
32+
}
33+
34+
let uint mid = v_len / 2u;
35+
let vec[T] a = slice[T](v, 0u, mid);
36+
let vec[T] b = slice[T](v, mid, v_len);
37+
ret merge[T](le,
38+
merge_sort[T](le, a),
39+
merge_sort[T](le, b));
40+
}
41+
42+
// Local Variables:
43+
// mode: rust;
44+
// fill-column: 78;
45+
// indent-tabs-mode: nil
46+
// c-basic-offset: 4
47+
// buffer-file-coding-system: utf-8-unix
48+
// compile-command: "make -k -C .. 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
49+
// End:

trunk/src/lib/std.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ mod list;
5555
mod rand;
5656
mod dbg;
5757
mod bitv;
58+
mod sort;
5859

5960
// Local Variables:
6061
// mode: rust;

trunk/src/test/run-pass/lib-sort.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use std;
2+
3+
fn check_sort(vec[int] v1, vec[int] v2) {
4+
auto len = std._vec.len[int](v1);
5+
fn lteq(&int a, &int b) -> bool {
6+
ret a <= b;
7+
}
8+
auto f = lteq;
9+
auto v3 = std.sort.merge_sort[int](f, v1);
10+
auto i = 0u;
11+
while (i < len) {
12+
log v3.(i);
13+
check (v3.(i) == v2.(i));
14+
i += 1u;
15+
}
16+
}
17+
18+
fn main() {
19+
{
20+
auto v1 = vec(3,7,4,5,2,9,5,8);
21+
auto v2 = vec(2,3,4,5,5,7,8,9);
22+
check_sort(v1, v2);
23+
}
24+
25+
{
26+
auto v1 = vec(1,1,1);
27+
auto v2 = vec(1,1,1);
28+
check_sort(v1, v2);
29+
}
30+
31+
{
32+
let vec[int] v1 = vec();
33+
let vec[int] v2 = vec();
34+
check_sort(v1, v2);
35+
}
36+
37+
{
38+
auto v1 = vec(9);
39+
auto v2 = vec(9);
40+
check_sort(v1, v2);
41+
}
42+
43+
{
44+
auto v1 = vec(9,3,3,3,9);
45+
auto v2 = vec(3,3,3,9,9);
46+
check_sort(v1, v2);
47+
}
48+
49+
}
50+

0 commit comments

Comments
 (0)