fix for cl

This commit is contained in:
方而静 2024-06-16 21:36:50 +08:00
parent ebdfb794ba
commit 3728c02b87
Signed by: szTom
GPG Key ID: 072D999D60C6473C

View File

@ -2,14 +2,14 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
static void merge(void* a_begin, static void merge(char* a_begin,
void* a_end, char* a_end,
void* b_begin, char* b_begin,
void* b_end, char* b_end,
void* res, char* res,
int elem_size, int elem_size,
int (*cmp)(const void* a, const void* b)) { int (*cmp)(const void* a, const void* b)) {
void *a = a_begin, *b = b_begin, *r = res; char *a = a_begin, *b = b_begin, *r = res;
while(a < a_end && b < b_end) { while(a < a_end && b < b_end) {
if(cmp(a, b) <= 0) { if(cmp(a, b) <= 0) {
memcpy(r, a, elem_size); memcpy(r, a, elem_size);
@ -28,15 +28,15 @@ static void merge(void* a_begin,
memcpy(r, b, elem_size); memcpy(r, b, elem_size);
} }
void c11__stable_sort(void* ptr, void c11__stable_sort(void* ptr_,
int count, int count,
int elem_size, int elem_size,
int (*cmp)(const void* a, const void* b)) { int (*cmp)(const void* a, const void* b)) {
// merge sort // merge sort
void* tmp = malloc(count * elem_size); char* ptr = ptr_, *tmp = malloc(count * elem_size);
for(int seg = 1; seg < count; seg *= 2) { for(int seg = 1; seg < count; seg *= 2) {
for(void* a = ptr; a < ptr + (count - seg) * elem_size; a += 2 * seg * elem_size) { for(char* a = ptr; a < ptr + (count - seg) * elem_size; a += 2 * seg * elem_size) {
void* b = a + seg * elem_size, *a_end = b, *b_end = b + seg * elem_size; char* b = a + seg * elem_size, *a_end = b, *b_end = b + seg * elem_size;
if (b_end > ptr + count * elem_size) if (b_end > ptr + count * elem_size)
b_end = ptr + count * elem_size; b_end = ptr + count * elem_size;
merge(a, a_end, b, b_end, tmp, elem_size, cmp); merge(a, a_end, b, b_end, tmp, elem_size, cmp);