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

This commit is contained in:
Alex Lyon
2018-05-13 03:15:16 -07:00
parent aa21e5fc3f
commit b15aa83a8a
+20 -12
View File
@@ -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,