@@ -172,16 +172,16 @@ pub fn tim_sort<T: Ord>(array: &[mut T]) {
172
172
return ;
173
173
}
174
174
175
+ let ms = & MergeState ( ) ;
176
+ ms. array = array;
177
+ let min_run = min_run_length ( size) ;
178
+
175
179
if size < MIN_MERGE {
176
180
let init_run_len = count_run_ascending ( array) ;
177
- binarysort ( array, init_run_len) ;
181
+ ms . binarysort ( array, init_run_len) ;
178
182
return ;
179
183
}
180
184
181
- let ms = & MergeState ( ) ;
182
- ms. array = array;
183
- let min_run = min_run_length ( size) ;
184
-
185
185
let mut idx = 0 ;
186
186
let mut remaining = size;
187
187
loop {
@@ -191,7 +191,7 @@ pub fn tim_sort<T: Ord>(array: &[mut T]) {
191
191
if run_len < min_run {
192
192
let force = if remaining <= min_run { remaining} else { min_run} ;
193
193
let slice = vec:: mut_view ( arr, 0 , force) ;
194
- binarysort ( slice, run_len) ;
194
+ ms . binarysort ( slice, run_len) ;
195
195
run_len = force;
196
196
}
197
197
@@ -206,47 +206,7 @@ pub fn tim_sort<T: Ord>(array: &[mut T]) {
206
206
ms. merge_force_collapse ( array) ;
207
207
}
208
208
209
- fn binarysort < T : Ord > ( array : & [ mut T ] , start : uint ) {
210
- let size = array. len ( ) ;
211
- let mut start = start;
212
- assert start <= size;
213
-
214
- if start == 0 { start += 1 ; }
215
-
216
- let mut pivot = ~[ ] ;
217
- vec:: reserve ( & mut pivot, 1 ) ;
218
- unsafe { vec:: raw:: set_len ( & mut pivot, 1 ) ; } ;
219
-
220
- while start < size {
221
- unsafe {
222
- let tmp_view = vec:: mut_view ( array, start, start+1 ) ;
223
- vec:: raw:: memmove ( pivot, tmp_view, 1 ) ;
224
- }
225
- let mut left = 0 ;
226
- let mut right = start;
227
- assert left <= right;
228
-
229
- while left < right {
230
- let mid = ( left + right) >> 1 ;
231
- if pivot[ 0 ] < array[ mid] {
232
- right = mid;
233
- } else {
234
- left = mid+1 ;
235
- }
236
- }
237
- assert left == right;
238
- let mut n = start-left;
239
-
240
- unsafe {
241
- move_vec ( array, left+1 , array, left, n) ;
242
- }
243
- array[ left] <-> pivot[ 0 ] ;
244
- start += 1 ;
245
- }
246
- unsafe { vec:: raw:: set_len ( & mut pivot, 0 ) ; } // Forget the boxed element
247
- }
248
-
249
- /// Reverse the order of elements in a slice, in place
209
+ // Reverse the order of elements in a slice, in place
250
210
fn reverse_slice < T > ( v : & [ mut T ] , start : uint , end : uint ) {
251
211
let mut i = start;
252
212
while i < end / 2 {
@@ -395,6 +355,7 @@ struct MergeState<T> {
395
355
mut min_gallop : uint ,
396
356
mut tmp : ~[ T ] ,
397
357
mut last_hi : bool ,
358
+ mut last_bsort : bool ,
398
359
mut mergePt : uint ,
399
360
mut tmpPt : uint ,
400
361
mut array : & [ mut T ] ,
@@ -404,7 +365,9 @@ struct MergeState<T> {
404
365
unsafe {
405
366
let size = self . tmp. len( ) ;
406
367
// Move tmp back into invalid part of array
407
- if self . last_hi && size > 0 {
368
+ if self . last_bsort {
369
+
370
+ } else if self . last_hi && size > 0 {
408
371
self . mergePt -= self . tmpPt ;
409
372
move_vec ( self . array , self . mergePt , self . tmp , 0 , self . tmpPt ) ;
410
373
} else if !self . last_hi && size-self . tmpPt > 0 {
@@ -421,8 +384,9 @@ fn MergeState<T>() -> MergeState<T> {
421
384
vec:: reserve ( & mut tmp, INITIAL_TMP_STORAGE ) ;
422
385
MergeState {
423
386
min_gallop : MIN_GALLOP ,
424
- tmp : tmp,
387
+ tmp : move tmp,
425
388
last_hi : false ,
389
+ last_bsort : false ,
426
390
mergePt : 0 ,
427
391
tmpPt : 0 ,
428
392
array : & [ mut] ,
@@ -431,6 +395,45 @@ fn MergeState<T>() -> MergeState<T> {
431
395
}
432
396
433
397
impl < T : Ord > & MergeState < T > {
398
+ fn binarysort ( array : & [ mut T ] , start : uint ) {
399
+ let size = array. len ( ) ;
400
+ let mut start = start;
401
+ assert start <= size;
402
+
403
+ if start == 0 { start += 1 ; }
404
+
405
+ self . last_bsort = true ;
406
+ unsafe { vec:: raw:: set_len ( & mut self . tmp , 1 ) ; } ;
407
+
408
+ while start < size {
409
+ unsafe {
410
+ move_vec ( self . tmp , 0 , array, start, 1 ) ;
411
+ }
412
+ let mut left = 0 ;
413
+ let mut right = start;
414
+ assert left <= right;
415
+
416
+ while left < right {
417
+ let mid = ( left + right) >> 1 ;
418
+ if self . tmp [ 0 ] < array[ mid] {
419
+ right = mid;
420
+ } else {
421
+ left = mid+1 ;
422
+ }
423
+ }
424
+ assert left == right;
425
+ let mut n = start-left;
426
+
427
+ unsafe {
428
+ move_vec ( array, left+1 , array, left, n) ;
429
+ }
430
+ array[ left] <-> self . tmp [ 0 ] ;
431
+ start += 1 ;
432
+ }
433
+ unsafe { vec:: raw:: set_len ( & mut self . tmp , 0 ) ; } // Forget the boxed element
434
+ self . last_bsort = false ;
435
+ }
436
+
434
437
fn push_run ( run_base : uint , run_len : uint ) {
435
438
let tmp = RunState { base : run_base, len : run_len} ;
436
439
self . runs . push ( tmp) ;
@@ -958,7 +961,7 @@ mod tests {
958
961
// tjc: funny that we have to use parens
959
962
pure fn ile ( x : & ( & static /str ) , y : & ( & static /str ) ) -> bool
960
963
{
961
- unsafe // to_lower is not pure...
964
+ unsafe // to_lower is not pure...
962
965
{
963
966
let x = x. to_lower ( ) ;
964
967
let y = y. to_lower ( ) ;
@@ -977,7 +980,6 @@ mod tests {
977
980
978
981
#[ cfg( test) ]
979
982
mod test_tim_sort {
980
- // #[legacy_exports];
981
983
struct CVal {
982
984
val : ~float ,
983
985
}
@@ -1043,51 +1045,27 @@ mod test_tim_sort {
1043
1045
tim_sort ( arr) ;
1044
1046
fail ~"Guarantee the fail";
1045
1047
}
1046
-
1047
- struct DVal { val : ~uint }
1048
- impl DVal : Ord {
1049
- pure fn lt ( _x : & DVal ) -> bool { true }
1050
- pure fn le ( _x : & DVal ) -> bool { true }
1051
- pure fn gt ( _x : & DVal ) -> bool { true }
1052
- pure fn ge ( _x : & DVal ) -> bool { true }
1053
- }
1054
-
1055
- #[ test]
1056
- #[ should_fail]
1057
- fn test_bad_Ord_impl ( ) {
1058
- let rng = rand:: Rng ( ) ;
1059
- let mut arr = do vec:: from_fn ( 500 ) |_i| {
1060
- let randVal = rng. gen_uint ( ) ;
1061
- DVal { val : ~randVal }
1062
- } ;
1063
-
1064
- tim_sort ( arr) ;
1065
- fail ~"Guarantee the fail";
1066
- }
1067
1048
}
1068
1049
1069
- /*
1070
1050
#[ cfg( test) ]
1071
1051
mod big_tests {
1072
1052
1073
1053
#[ test]
1074
- fn sorts_test () {
1054
+ fn test_unique ( ) {
1075
1055
let low = 5 ;
1076
1056
let high = 10 ;
1077
-
1078
- //pure fn le(a: &~float, b: &~float) -> bool { *a <= *b }
1079
-
1080
- //let s1 = fn(arr: &[mut ~float]) { tim_sort(arr); };
1081
- //let s2 = fn(arr: &[mut ~float]) { quick_sort(arr, le); };
1082
- //let s3 = fn(arr: &[mut ~float]) { quick_sort3(arr); };
1083
- //let s4 = fn(arr: &[mut ~float]) { let rs = merge_sort(arr, le);
1084
- // for rs.eachi |i, v| {arr[i] = *v}};
1085
-
1086
-
1087
- // Run tabulate_unique and tabulate_managed
1088
- // with the other sorts at some point
1089
1057
tabulate_unique ( low, high) ;
1058
+ }
1059
+
1060
+ #[ test]
1061
+ fn test_managed ( ) {
1062
+ let low = 5 ;
1063
+ let high = 10 ;
1090
1064
tabulate_managed ( low, high) ;
1065
+ }
1066
+
1067
+ #[ test]
1068
+ fn test_linear ( ) {
1091
1069
tabulate_linear ( ) ;
1092
1070
}
1093
1071
@@ -1096,14 +1074,14 @@ mod big_tests {
1096
1074
let res = do vec:: from_fn ( num) |i| {
1097
1075
arr[ i % size]
1098
1076
} ;
1099
- vec::to_mut(res)
1077
+ vec:: to_mut ( move res)
1100
1078
}
1101
1079
1102
1080
fn makeRange ( n : uint ) -> ~[ uint ] {
1103
1081
let one = do vec:: from_fn ( n) |i| { i } ;
1104
1082
let mut two = copy one;
1105
1083
vec:: reverse ( two) ;
1106
- vec::append(two, one)
1084
+ vec:: append ( move two, one)
1107
1085
}
1108
1086
1109
1087
fn tabulate_unique ( lo : uint , hi : uint ) {
@@ -1122,7 +1100,7 @@ mod big_tests {
1122
1100
let arr = do vec:: from_fn( n) |_i| {
1123
1101
~rng. gen_float( )
1124
1102
} ;
1125
- let arr = vec::to_mut(arr);
1103
+ let arr = vec:: to_mut( move arr) ;
1126
1104
1127
1105
tim_sort( arr) ; // *sort
1128
1106
isSorted( arr) ;
@@ -1163,7 +1141,7 @@ mod big_tests {
1163
1141
let arr = if n > 4 {
1164
1142
let part = vec:: view ( arr, 0 , 4 ) ;
1165
1143
multiplyVec ( part, n)
1166
- } else { arr };
1144
+ } else { move arr } ;
1167
1145
tim_sort( arr) ; // ~sort
1168
1146
isSorted( arr) ;
1169
1147
@@ -1195,7 +1173,7 @@ mod big_tests {
1195
1173
let arr = do vec:: from_fn( n) |_i| {
1196
1174
@rng. gen_float( )
1197
1175
} ;
1198
- let arr = vec::to_mut(arr);
1176
+ let arr = vec:: to_mut( move arr) ;
1199
1177
1200
1178
tim_sort( arr) ; // *sort
1201
1179
isSorted( arr, 1 ) ;
@@ -1236,7 +1214,7 @@ mod big_tests {
1236
1214
let arr = if n > 4 {
1237
1215
let part = vec:: view ( arr, 0 , 4 ) ;
1238
1216
multiplyVec ( part, n)
1239
- } else { arr };
1217
+ } else { move arr } ;
1240
1218
tim_sort ( arr) ; // ~sort
1241
1219
isSorted ( arr, n/4 +1 ) ;
1242
1220
@@ -1247,7 +1225,7 @@ mod big_tests {
1247
1225
let half = n / 2 ;
1248
1226
let mut arr = makeRange ( half) . map ( |i| @( * i as float ) ) ;
1249
1227
tim_sort ( arr) ; // !sort
1250
- isSorted(arr, 2 );
1228
+ isSorted ( arr, 1 ) ;
1251
1229
}
1252
1230
}
1253
1231
@@ -1294,7 +1272,7 @@ mod big_tests {
1294
1272
let mut arr = do vec:: from_fn( n) |i| {
1295
1273
LVal { val : i, key : key }
1296
1274
} ;
1297
- // tim_sort(arr);
1275
+ tim_sort( arr) ;
1298
1276
isSorted( arr) ;
1299
1277
}
1300
1278
@@ -1305,7 +1283,6 @@ mod big_tests {
1305
1283
assert n == dropped;
1306
1284
}
1307
1285
}
1308
- */
1309
1286
1310
1287
// Local Variables:
1311
1288
// mode: rust;
0 commit comments