|
11 | 11 | //! Sorting methods
|
12 | 12 |
|
13 | 13 | use core::cmp::{Eq, Ord};
|
14 |
| -use core::dvec::DVec; |
15 | 14 | use core::prelude::*;
|
16 | 15 | use core::util;
|
17 | 16 | use core::vec::{len, push};
|
@@ -189,7 +188,7 @@ pub fn tim_sort<T:Copy + Ord>(array: &mut [T]) {
|
189 | 188 | return;
|
190 | 189 | }
|
191 | 190 |
|
192 |
| - let ms = &MergeState(); |
| 191 | + let mut ms = MergeState(); |
193 | 192 | let min_run = min_run_length(size);
|
194 | 193 |
|
195 | 194 | let mut idx = 0;
|
@@ -392,66 +391,63 @@ struct RunState {
|
392 | 391 | }
|
393 | 392 |
|
394 | 393 | struct MergeState<T> {
|
395 |
| - mut min_gallop: uint, |
396 |
| - runs: DVec<RunState>, |
| 394 | + min_gallop: uint, |
| 395 | + runs: ~[RunState], |
397 | 396 | }
|
398 | 397 |
|
399 | 398 | // Fixme (#3853) Move into MergeState
|
400 | 399 | fn MergeState<T>() -> MergeState<T> {
|
401 | 400 | MergeState {
|
402 | 401 | min_gallop: MIN_GALLOP,
|
403 |
| - runs: DVec(), |
| 402 | + runs: ~[], |
404 | 403 | }
|
405 | 404 | }
|
406 | 405 |
|
407 |
| -pub impl<T:Copy + Ord> MergeState<T> { |
408 |
| - fn push_run(&self, run_base: uint, run_len: uint) { |
| 406 | +impl<T:Copy + Ord> MergeState<T> { |
| 407 | + fn push_run(&mut self, run_base: uint, run_len: uint) { |
409 | 408 | let tmp = RunState{base: run_base, len: run_len};
|
410 | 409 | self.runs.push(tmp);
|
411 | 410 | }
|
412 | 411 |
|
413 |
| - fn merge_at(&self, n: uint, array: &mut [T]) { |
| 412 | + fn merge_at(&mut self, n: uint, array: &mut [T]) { |
414 | 413 | let mut size = self.runs.len();
|
415 | 414 | fail_unless!(size >= 2);
|
416 | 415 | fail_unless!(n == size-2 || n == size-3);
|
417 | 416 |
|
418 |
| - do self.runs.borrow_mut |arr| { |
| 417 | + let mut b1 = self.runs[n].base; |
| 418 | + let mut l1 = self.runs[n].len; |
| 419 | + let b2 = self.runs[n+1].base; |
| 420 | + let l2 = self.runs[n+1].len; |
419 | 421 |
|
420 |
| - let mut b1 = arr[n].base; |
421 |
| - let mut l1 = arr[n].len; |
422 |
| - let b2 = arr[n+1].base; |
423 |
| - let l2 = arr[n+1].len; |
| 422 | + fail_unless!(l1 > 0 && l2 > 0); |
| 423 | + fail_unless!(b1 + l1 == b2); |
424 | 424 |
|
425 |
| - fail_unless!(l1 > 0 && l2 > 0); |
426 |
| - fail_unless!(b1 + l1 == b2); |
427 |
| - |
428 |
| - arr[n].len = l1 + l2; |
429 |
| - if n == size-3 { |
430 |
| - arr[n+1].base = arr[n+2].base; |
431 |
| - arr[n+1].len = arr[n+2].len; |
432 |
| - } |
| 425 | + self.runs[n].len = l1 + l2; |
| 426 | + if n == size-3 { |
| 427 | + self.runs[n+1].base = self.runs[n+2].base; |
| 428 | + self.runs[n+1].len = self.runs[n+2].len; |
| 429 | + } |
433 | 430 |
|
434 |
| - let slice = vec::mut_slice(array, b1, b1+l1); |
435 |
| - let k = gallop_right(&const array[b2], slice, 0); |
436 |
| - b1 += k; |
437 |
| - l1 -= k; |
438 |
| - if l1 != 0 { |
439 |
| - let slice = vec::mut_slice(array, b2, b2+l2); |
440 |
| - let l2 = gallop_left( |
441 |
| - &const array[b1+l1-1],slice,l2-1); |
442 |
| - if l2 > 0 { |
443 |
| - if l1 <= l2 { |
444 |
| - self.merge_lo(array, b1, l1, b2, l2); |
445 |
| - } else { |
446 |
| - self.merge_hi(array, b1, l1, b2, l2); |
447 |
| - } |
| 431 | + let slice = vec::mut_slice(array, b1, b1+l1); |
| 432 | + let k = gallop_right(&const array[b2], slice, 0); |
| 433 | + b1 += k; |
| 434 | + l1 -= k; |
| 435 | + if l1 != 0 { |
| 436 | + let slice = vec::mut_slice(array, b2, b2+l2); |
| 437 | + let l2 = gallop_left( |
| 438 | + &const array[b1+l1-1],slice,l2-1); |
| 439 | + if l2 > 0 { |
| 440 | + if l1 <= l2 { |
| 441 | + self.merge_lo(array, b1, l1, b2, l2); |
| 442 | + } else { |
| 443 | + self.merge_hi(array, b1, l1, b2, l2); |
448 | 444 | }
|
449 | 445 | }
|
450 | 446 | }
|
451 | 447 | self.runs.pop();
|
452 | 448 | }
|
453 | 449 |
|
454 |
| - fn merge_lo(&self, array: &mut [T], base1: uint, len1: uint, |
| 450 | + fn merge_lo(&mut self, array: &mut [T], base1: uint, len1: uint, |
455 | 451 | base2: uint, len2: uint) {
|
456 | 452 | fail_unless!(len1 != 0 && len2 != 0 && base1+len1 == base2);
|
457 | 453 |
|
@@ -554,7 +550,7 @@ pub impl<T:Copy + Ord> MergeState<T> {
|
554 | 550 | }
|
555 | 551 | }
|
556 | 552 |
|
557 |
| - fn merge_hi(&self, array: &mut [T], base1: uint, len1: uint, |
| 553 | + fn merge_hi(&mut self, array: &mut [T], base1: uint, len1: uint, |
558 | 554 | base2: uint, len2: uint) {
|
559 | 555 | fail_unless!(len1 != 1 && len2 != 0 && base1 + len1 == base2);
|
560 | 556 |
|
@@ -672,32 +668,28 @@ pub impl<T:Copy + Ord> MergeState<T> {
|
672 | 668 | }
|
673 | 669 | }
|
674 | 670 |
|
675 |
| - fn merge_collapse(&self, array: &mut [T]) { |
| 671 | + fn merge_collapse(&mut self, array: &mut [T]) { |
676 | 672 | while self.runs.len() > 1 {
|
677 | 673 | let mut n = self.runs.len()-2;
|
678 |
| - let chk = do self.runs.borrow |arr| { |
679 |
| - if n > 0 && arr[n-1].len <= arr[n].len + arr[n+1].len { |
680 |
| - if arr[n-1].len < arr[n+1].len { n -= 1; } |
681 |
| - true |
682 |
| - } else if arr[n].len <= arr[n+1].len { |
683 |
| - true |
684 |
| - } else { |
685 |
| - false |
686 |
| - } |
687 |
| - }; |
688 |
| - if !chk { break; } |
| 674 | + if n > 0 && |
| 675 | + self.runs[n-1].len <= self.runs[n].len + self.runs[n+1].len |
| 676 | + { |
| 677 | + if self.runs[n-1].len < self.runs[n+1].len { n -= 1; } |
| 678 | + } else if self.runs[n].len <= self.runs[n+1].len { |
| 679 | + /* keep going */ |
| 680 | + } else { |
| 681 | + break; |
| 682 | + } |
689 | 683 | self.merge_at(n, array);
|
690 | 684 | }
|
691 | 685 | }
|
692 | 686 |
|
693 |
| - fn merge_force_collapse(&self, array: &mut [T]) { |
| 687 | + fn merge_force_collapse(&mut self, array: &mut [T]) { |
694 | 688 | while self.runs.len() > 1 {
|
695 | 689 | let mut n = self.runs.len()-2;
|
696 | 690 | if n > 0 {
|
697 |
| - do self.runs.borrow |arr| { |
698 |
| - if arr[n-1].len < arr[n+1].len { |
699 |
| - n -= 1; |
700 |
| - } |
| 691 | + if self.runs[n-1].len < self.runs[n+1].len { |
| 692 | + n -= 1; |
701 | 693 | }
|
702 | 694 | }
|
703 | 695 | self.merge_at(n, array);
|
|
0 commit comments