@@ -172,16 +172,16 @@ pub fn tim_sort<T: Copy 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
-
179
175
if size < MIN_MERGE {
180
176
let init_run_len = count_run_ascending ( array) ;
181
- ms . binarysort ( array, init_run_len) ;
177
+ binarysort ( array, init_run_len) ;
182
178
return ;
183
179
}
184
180
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: Copy 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
- ms . binarysort ( slice, run_len) ;
194
+ binarysort ( slice, run_len) ;
195
195
run_len = force;
196
196
}
197
197
@@ -206,6 +206,36 @@ pub fn tim_sort<T: Copy Ord>(array: &[mut T]) {
206
206
ms. merge_force_collapse ( array) ;
207
207
}
208
208
209
+ fn binarysort < T : Copy 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
+ while start < size {
217
+ let pivot = array[ start] ;
218
+ let mut left = 0 ;
219
+ let mut right = start;
220
+ assert left <= right;
221
+
222
+ while left < right {
223
+ let mid = ( left + right) >> 1 ;
224
+ if pivot < array[ mid] {
225
+ right = mid;
226
+ } else {
227
+ left = mid+1 ;
228
+ }
229
+ }
230
+ assert left == right;
231
+ let mut n = start-left;
232
+
233
+ copy_vec ( array, left+1 , array, left, n) ;
234
+ array[ left] = move pivot;
235
+ start += 1 ;
236
+ }
237
+ }
238
+
209
239
// Reverse the order of elements in a slice, in place
210
240
fn reverse_slice < T > ( v : & [ mut T ] , start : uint , end : uint ) {
211
241
let mut i = start;
@@ -366,36 +396,6 @@ fn MergeState<T>() -> MergeState<T> {
366
396
}
367
397
368
398
impl < T : Copy Ord > MergeState < T > {
369
- fn binarysort ( & self , array : & [ mut T ] , start : uint ) {
370
- let size = array. len ( ) ;
371
- let mut start = start;
372
- assert start <= size;
373
-
374
- if start == 0 { start += 1 ; }
375
-
376
- while start < size {
377
- let pivot = array[ start] ;
378
- let mut left = 0 ;
379
- let mut right = start;
380
- assert left <= right;
381
-
382
- while left < right {
383
- let mid = ( left + right) >> 1 ;
384
- if pivot < array[ mid] {
385
- right = mid;
386
- } else {
387
- left = mid+1 ;
388
- }
389
- }
390
- assert left == right;
391
- let mut n = start-left;
392
-
393
- copy_vec ( array, left+1 , array, left, n) ;
394
- array[ left] = move pivot;
395
- start += 1 ;
396
- }
397
- }
398
-
399
399
fn push_run ( & self , run_base : uint , run_len : uint ) {
400
400
let tmp = RunState { base : run_base, len : run_len} ;
401
401
self . runs . push ( tmp) ;
0 commit comments