Browse Source

stdlib: move insertion sort from introsort() into a separate function

Alex Lyon 6 years ago
parent
commit
b15aa83a8a
1 changed files with 20 additions and 12 deletions
  1. 20 12
      src/stdlib/src/sort.rs

+ 20 - 12
src/stdlib/src/sort.rs

@@ -34,18 +34,7 @@ fn introsort_helper(
     const THRESHOLD: size_t = 8;
 
     if nel < THRESHOLD {
-        // use an insertion sort instead of an introsort on small arrays
-        for i in 0..nel {
-            for j in (0..i).rev() {
-                let current = unsafe { base.add(j * width) };
-                let prev = unsafe { base.add((j + 1) * width) };
-                if comp(current as *const c_void, prev as *const c_void) > 0 {
-                    swap(current, prev, width);
-                } else {
-                    break;
-                }
-            }
-        }
+        insertion_sort(base, nel, width, comp);
     } else if nel > 1 {
         if maxdepth == 0 {
             heapsort(base, nel, width, comp);
@@ -58,6 +47,25 @@ fn introsort_helper(
     }
 }
 
+fn insertion_sort(
+    base: *mut c_char,
+    nel: size_t,
+    width: size_t,
+    comp: extern "C" fn(*const c_void, *const c_void) -> c_int,
+) {
+    for i in 0..nel {
+        for j in (0..i).rev() {
+            let current = unsafe { base.add(j * width) };
+            let prev = unsafe { base.add((j + 1) * width) };
+            if comp(current as *const c_void, prev as *const c_void) > 0 {
+                swap(current, prev, width);
+            } else {
+                break;
+            }
+        }
+    }
+}
+
 fn heapsort(
     base: *mut c_char,
     nel: size_t,