@@ -9,10 +9,10 @@ export merge_sort;
9
9
export quick_sort;
10
10
export quick_sort3;
11
11
12
- type lteq [ T ] = fn ( & T , & T ) -> bool ;
12
+ type lteq [ T ] = block ( & T , & T ) -> bool ;
13
13
14
- fn merge_sort [ @T ] ( le : lteq[ T ] , v : vec[ T ] ) -> vec[ T ] {
15
- fn merge [ @T ] ( le : lteq[ T ] , a : vec[ T ] , b : vec[ T ] ) -> vec[ T ] {
14
+ fn merge_sort [ @T ] ( le : & lteq[ T ] , v : vec[ T ] ) -> vec[ T ] {
15
+ fn merge [ @T ] ( le : & lteq[ T ] , a : vec[ T ] , b : vec[ T ] ) -> vec[ T ] {
16
16
let rs: vec[ T ] = [ ] ;
17
17
let a_len: uint = len[ T ] ( a) ;
18
18
let a_ix: uint = 0 u;
@@ -42,8 +42,8 @@ fn swap[@T](arr: vec[mutable T], x: uint, y: uint) {
42
42
arr. ( y) = a;
43
43
}
44
44
45
- fn part [ @T ] ( compare_func : lteq[ T ] , arr : vec[ mutable T ] , left : uint ,
46
- right : uint , pivot : uint ) -> uint {
45
+ fn part [ @T ] ( compare_func : & lteq[ T ] , arr : vec[ mutable T ] , left : uint ,
46
+ right : uint , pivot : uint ) -> uint {
47
47
let pivot_value = arr. ( pivot) ;
48
48
swap[ T ] ( arr, pivot, right) ;
49
49
let storage_index: uint = left;
@@ -59,8 +59,8 @@ fn part[@T](compare_func: lteq[T], arr: vec[mutable T], left: uint,
59
59
ret storage_index;
60
60
}
61
61
62
- fn qsort [ @T ] ( compare_func : lteq[ T ] , arr : vec[ mutable T ] , left : uint ,
63
- right : uint ) {
62
+ fn qsort [ @T ] ( compare_func : & lteq[ T ] , arr : vec[ mutable T ] , left : uint ,
63
+ right : uint ) {
64
64
if right > left {
65
65
let pivot = ( left + right) / 2 u;
66
66
let new_pivot = part[ T ] ( compare_func, arr, left, right, pivot) ;
@@ -72,7 +72,7 @@ fn qsort[@T](compare_func: lteq[T], arr: vec[mutable T], left: uint,
72
72
}
73
73
}
74
74
75
- fn quick_sort [ @T ] ( compare_func : lteq[ T ] , arr : vec[ mutable T ] ) {
75
+ fn quick_sort [ @T ] ( compare_func : & lteq[ T ] , arr : vec[ mutable T ] ) {
76
76
if len[ T ] ( arr) == 0 u { ret; }
77
77
qsort[ T ] ( compare_func, arr, 0 u, len[ T ] ( arr) - 1 u) ;
78
78
}
@@ -82,7 +82,7 @@ fn quick_sort[@T](compare_func: lteq[T], arr: vec[mutable T]) {
82
82
// http://www.cs.princeton.edu/~rs/talks/QuicksortIsOptimal.pdf
83
83
// According to these slides this is the algorithm of choice for
84
84
// 'randomly ordered keys, abstract compare' & 'small number of key values'
85
- fn qsort3 [ @T ] ( compare_func_lt : lteq[ T ] , compare_func_eq : lteq[ T ] ,
85
+ fn qsort3 [ @T ] ( compare_func_lt : & lteq[ T ] , compare_func_eq : & lteq[ T ] ,
86
86
arr : vec[ mutable T ] , left : int , right : int ) {
87
87
if right <= left { ret; }
88
88
let v: T = arr. ( right) ;
@@ -130,7 +130,7 @@ fn qsort3[@T](compare_func_lt: lteq[T], compare_func_eq: lteq[T],
130
130
qsort3[ T ] ( compare_func_lt, compare_func_eq, arr, i, right) ;
131
131
}
132
132
133
- fn quick_sort3 [ @T ] ( compare_func_lt : lteq[ T ] , compare_func_eq : lteq[ T ] ,
133
+ fn quick_sort3 [ @T ] ( compare_func_lt : & lteq[ T ] , compare_func_eq : & lteq[ T ] ,
134
134
arr : vec[ mutable T ] ) {
135
135
if vec:: len[ T ] ( arr) == 0 u { ret; }
136
136
qsort3[ T ] ( compare_func_lt, compare_func_eq, arr, 0 ,
@@ -144,8 +144,8 @@ mod ivector {
144
144
145
145
type lteq [ T ] = fn ( & T , & T ) -> bool ;
146
146
147
- fn merge_sort [ @T ] ( le : lteq[ T ] , v : & [ T ] ) -> [ T ] {
148
- fn merge [ @T ] ( le : lteq[ T ] , a : & [ T ] , b : & [ T ] ) -> [ T ] {
147
+ fn merge_sort [ @T ] ( le : & lteq[ T ] , v : & [ T ] ) -> [ T ] {
148
+ fn merge [ @T ] ( le : & lteq[ T ] , a : & [ T ] , b : & [ T ] ) -> [ T ] {
149
149
let rs: [ T ] = ~[ ] ;
150
150
let a_len: uint = ilen[ T ] ( a) ;
151
151
let a_ix: uint = 0 u;
@@ -175,8 +175,8 @@ mod ivector {
175
175
arr. ( y) = a;
176
176
}
177
177
178
- fn part [ @T ] ( compare_func : lteq[ T ] , arr : & [ mutable T ] , left : uint ,
179
- right : uint , pivot : uint ) -> uint {
178
+ fn part [ @T ] ( compare_func : & lteq[ T ] , arr : & [ mutable T ] , left : uint ,
179
+ right : uint , pivot : uint ) -> uint {
180
180
let pivot_value = arr. ( pivot) ;
181
181
swap[ T ] ( arr, pivot, right) ;
182
182
let storage_index: uint = left;
@@ -192,8 +192,8 @@ mod ivector {
192
192
ret storage_index;
193
193
}
194
194
195
- fn qsort [ @T ] ( compare_func : lteq[ T ] , arr : & [ mutable T ] , left : uint ,
196
- right : uint ) {
195
+ fn qsort [ @T ] ( compare_func : & lteq[ T ] , arr : & [ mutable T ] , left : uint ,
196
+ right : uint ) {
197
197
if right > left {
198
198
let pivot = ( left + right) / 2 u;
199
199
let new_pivot = part[ T ] ( compare_func, arr, left, right, pivot) ;
@@ -205,7 +205,7 @@ mod ivector {
205
205
}
206
206
}
207
207
208
- fn quick_sort [ @T ] ( compare_func : lteq[ T ] , arr : & [ mutable T ] ) {
208
+ fn quick_sort [ @T ] ( compare_func : & lteq[ T ] , arr : & [ mutable T ] ) {
209
209
if ilen[ T ] ( arr) == 0 u { ret; }
210
210
qsort[ T ] ( compare_func, arr, 0 u, ilen[ T ] ( arr) - 1 u) ;
211
211
}
@@ -216,8 +216,8 @@ mod ivector {
216
216
// According to these slides this is the algorithm of choice for
217
217
// 'randomly ordered keys, abstract compare' & 'small number of key
218
218
// values'
219
- fn qsort3 [ @T ] ( compare_func_lt : lteq[ T ] , compare_func_eq : lteq[ T ] ,
220
- arr : & [ mutable T ] , left : int , right : int ) {
219
+ fn qsort3 [ @T ] ( compare_func_lt : & lteq[ T ] , compare_func_eq : & lteq[ T ] ,
220
+ arr : & [ mutable T ] , left : int , right : int ) {
221
221
if right <= left { ret; }
222
222
let v: T = arr. ( right) ;
223
223
let i: int = left - 1 ;
@@ -264,8 +264,8 @@ mod ivector {
264
264
qsort3[ T ] ( compare_func_lt, compare_func_eq, arr, i, right) ;
265
265
}
266
266
267
- fn quick_sort3 [ @T ] ( compare_func_lt : lteq[ T ] , compare_func_eq : lteq[ T ] ,
268
- arr : & [ mutable T ] ) {
267
+ fn quick_sort3 [ @T ] ( compare_func_lt : & lteq[ T ] , compare_func_eq : & lteq[ T ] ,
268
+ arr : & [ mutable T ] ) {
269
269
if ilen[ T ] ( arr) == 0 u { ret; }
270
270
qsort3[ T ] ( compare_func_lt, compare_func_eq, arr, 0 ,
271
271
( ilen[ T ] ( arr) as int ) - 1 ) ;
0 commit comments