@@ -3,7 +3,7 @@ Module: sort
3
3
4
4
Sorting methods
5
5
*/
6
- import vec:: { len, slice } ;
6
+ import vec:: len;
7
7
8
8
export merge_sort;
9
9
export quick_sort;
@@ -21,29 +21,41 @@ Has worst case O(n log n) performance, best case O(n), but
21
21
is not space efficient. This is a stable sort.
22
22
*/
23
23
fn merge_sort < T : copy > ( le : le < T > , v : [ const T ] ) -> [ T ] {
24
+ type slice = ( uint , uint ) ;
25
+
26
+ ret merge_sort_ ( le, v, ( 0 u, len ( v) ) ) ;
27
+
28
+ fn merge_sort_ < T : copy > ( le : le < T > , v : [ const T ] , slice : slice ) -> [ T ] {
29
+ let begin = tuple:: first ( slice) ;
30
+ let end = tuple:: second ( slice) ;
31
+
32
+ let v_len = end - begin;
33
+ if v_len == 0 u { ret [ ] ; }
34
+ if v_len == 1 u { ret [ v[ begin] ] ; }
35
+
36
+ let mid = v_len / 2 u + begin;
37
+ let a = ( begin, mid) ;
38
+ let b = ( mid, end) ;
39
+ ret merge( le, merge_sort_ ( le, v, a) , merge_sort_ ( le, v, b) ) ;
40
+ }
41
+
24
42
fn merge < T : copy > ( le : le < T > , a : [ T ] , b : [ T ] ) -> [ T ] {
25
- let rs: [ T ] = [ ] ;
26
- let a_len: uint = len :: < T > ( a) ;
27
- let a_ix: uint = 0 u;
28
- let b_len: uint = len :: < T > ( b) ;
29
- let b_ix: uint = 0 u;
43
+ let rs = [ ] ;
44
+ vec:: reserve ( rs, len ( a) + len ( b) ) ;
45
+ let a_len = len ( a) ;
46
+ let a_ix = 0 u;
47
+ let b_len = len ( b) ;
48
+ let b_ix = 0 u;
30
49
while a_ix < a_len && b_ix < b_len {
31
50
if le ( a[ a_ix] , b[ b_ix] ) {
32
51
rs += [ a[ a_ix] ] ;
33
52
a_ix += 1 u;
34
53
} else { rs += [ b[ b_ix] ] ; b_ix += 1 u; }
35
54
}
36
- rs += slice :: < T > ( a, a_ix, a_len) ;
37
- rs += slice :: < T > ( b, b_ix, b_len) ;
55
+ rs += vec :: slice ( a, a_ix, a_len) ;
56
+ rs += vec :: slice ( b, b_ix, b_len) ;
38
57
ret rs;
39
58
}
40
- let v_len: uint = len :: < T > ( v) ;
41
- if v_len == 0 u { ret [ ] ; }
42
- if v_len == 1 u { ret [ v[ 0 ] ] ; }
43
- let mid: uint = v_len / 2 u;
44
- let a: [ T ] = slice :: < T > ( v, 0 u, mid) ;
45
- let b: [ T ] = slice :: < T > ( v, mid, v_len) ;
46
- ret merge:: < T > ( le, merge_sort :: < T > ( le, a) , merge_sort :: < T > ( le, b) ) ;
47
59
}
48
60
49
61
fn part < T : copy > ( compare_func : le < T > , arr : [ mutable T ] , left : uint ,
0 commit comments