Remove the wrong heapsort implementation
This commit is contained in:
@@ -1,21 +0,0 @@
|
|||||||
#ifndef UC_HEAPSORT_H_
|
|
||||||
#define UC_HEAPSORT_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
///compare function. Needs only to return < 0 if
|
|
||||||
//the first element is less than the second
|
|
||||||
typedef int (*uc_hs_cmp)(const void *, const void *);
|
|
||||||
|
|
||||||
void
|
|
||||||
uc_heapsort(void *base, size_t count, size_t width,
|
|
||||||
uc_hs_cmp cmp);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
#include <string.h>
|
|
||||||
#include "ucore/heapsort.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
uc_sift(unsigned char *base, size_t start, size_t count, size_t width,
|
|
||||||
uc_hs_cmp cmp)
|
|
||||||
{
|
|
||||||
size_t root = start, child;
|
|
||||||
|
|
||||||
while ((root * 2 + 1) < count) {
|
|
||||||
child = root * 2 + 1;
|
|
||||||
if (child < (count - 1)
|
|
||||||
&& cmp(&base[child * width], &base[(child + 1) * width]) < 0)
|
|
||||||
child++;
|
|
||||||
|
|
||||||
if (cmp(&base[root * width], &base[child * width]) < 0) {
|
|
||||||
memcpy(base + root * width, base + child * width, width);
|
|
||||||
root = child;
|
|
||||||
} else
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
uc_heapsort(void *base_, size_t count, size_t width,
|
|
||||||
uc_hs_cmp cmp)
|
|
||||||
{
|
|
||||||
int start = count / 2 - 1, end = count - 1;
|
|
||||||
unsigned char *base = base_;
|
|
||||||
|
|
||||||
while (start >= 0) {
|
|
||||||
uc_sift(base, start, count, width, cmp);
|
|
||||||
start--;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (end > 0) {
|
|
||||||
memcpy(base + end * width, base, width);
|
|
||||||
uc_sift(base, 0, end, width, cmp);
|
|
||||||
end--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user