stdlib: move insertion sort from introsort() into a separate function
This commit is contained in:
+20
-12
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user