]> git.lizzy.rs Git - rust.git/commitdiff
stdlib: Make merge_sort take [mutable? T]
authorBrian Anderson <banderson@mozilla.com>
Fri, 28 Oct 2011 20:56:01 +0000 (13:56 -0700)
committerBrian Anderson <banderson@mozilla.com>
Fri, 28 Oct 2011 20:56:01 +0000 (13:56 -0700)
src/lib/sort.rs
src/test/stdtest/sort.rs

index 6d4ead4c429935ac7b61380d327adb4ea8cb9f19..a4fe4cf3f8b2215fac2ec405fea6b65ecfe10e56 100644 (file)
@@ -20,7 +20,7 @@
 Has worst case O(n log n) performance, best case O(n), but
 is not space efficient. This is a stable sort.
 */
-fn merge_sort<T>(le: lteq<T>, v: [T]) -> [T] {
+fn merge_sort<T>(le: lteq<T>, v: [mutable? T]) -> [T] {
     fn merge<T>(le: lteq<T>, a: [T], b: [T]) -> [T] {
         let rs: [T] = [];
         let a_len: uint = len::<T>(a);
@@ -38,7 +38,8 @@ fn merge<T>(le: lteq<T>, a: [T], b: [T]) -> [T] {
         ret rs;
     }
     let v_len: uint = len::<T>(v);
-    if v_len <= 1u { ret v; }
+    if v_len == 0u { ret []; }
+    if v_len == 1u { ret [v[0]]; }
     let mid: uint = v_len / 2u;
     let a: [T] = slice::<T>(v, 0u, mid);
     let b: [T] = slice::<T>(v, mid, v_len);
index ff86042e6b11c8355ef23c387fca3cd1d74084e9..9e362f0c98817277161566a663893ece6a79df5a 100644 (file)
@@ -26,3 +26,11 @@ fn test() {
         check_sort(v1, v2);
     }
 }
+
+#[test]
+fn test_merge_sort_mutable() {
+    fn lteq(&&a: int, &&b: int) -> bool { ret a <= b; }
+    let v1 = [mutable 3, 2, 1];
+    let v2 = std::sort::merge_sort(lteq, v1);
+    assert v2 == [1, 2, 3];
+}
\ No newline at end of file