This commit is contained in:
blueloveTH 2024-08-15 01:02:21 +08:00
parent 92090aeaa1
commit 3e7af41e1f
2 changed files with 6 additions and 6 deletions

View File

@ -34,7 +34,7 @@
* `strcmp`. * `strcmp`.
*/ */
bool c11__stable_sort(void* ptr, bool c11__stable_sort(void* ptr,
int count, int length,
int elem_size, int elem_size,
int (*f_lt)(const void* a, const void* b, void* extra), int (*f_lt)(const void* a, const void* b, void* extra),
void* extra); void* extra);

View File

@ -33,16 +33,16 @@ static bool merge(char* a,
} }
bool c11__stable_sort(void* ptr_, bool c11__stable_sort(void* ptr_,
int count, int length,
int elem_size, int elem_size,
int (*f_lt)(const void* a, const void* b, void* extra), int (*f_lt)(const void* a, const void* b, void* extra),
void* extra) { void* extra) {
// merge sort // merge sort
char *ptr = ptr_, *tmp = malloc(count * elem_size); char *ptr = ptr_, *tmp = malloc(length * elem_size);
for(int seg = 1; seg < count; seg *= 2) { for(int seg = 1; seg < length; seg *= 2) {
for(char* a = ptr; a < ptr + (count - seg) * elem_size; a += 2 * seg * elem_size) { for(char* a = ptr; a < ptr + (length - seg) * elem_size; a += 2 * seg * elem_size) {
char *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) b_end = ptr + count * elem_size; if(b_end > ptr + length * elem_size) b_end = ptr + length * elem_size;
bool ok = merge(a, a_end, b, b_end, tmp, elem_size, f_lt, extra); bool ok = merge(a, a_end, b, b_end, tmp, elem_size, f_lt, extra);
if(!ok) { if(!ok) {
free(tmp); free(tmp);