mirror of https://github.com/flysand7/ciabatta.git
stdlib.h: qsort (slow)
This commit is contained in:
parent
d232486a11
commit
f068e506c7
16
inc/stdlib.h
16
inc/stdlib.h
|
@ -85,8 +85,20 @@ int at_quick_exit(void (*func)(void));
|
||||||
char *getenv (const char *name);
|
char *getenv (const char *name);
|
||||||
int system (const char *string);
|
int system (const char *string);
|
||||||
|
|
||||||
const void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
|
const void *bsearch(
|
||||||
// void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
|
const void *key,
|
||||||
|
const void *base,
|
||||||
|
size_t nmemb,
|
||||||
|
size_t size,
|
||||||
|
int (*compar)(const void *, const void *)
|
||||||
|
);
|
||||||
|
|
||||||
|
void qsort(
|
||||||
|
void *base,
|
||||||
|
size_t nmemb,
|
||||||
|
size_t size,
|
||||||
|
int (*compar)(const void *, const void *)
|
||||||
|
);
|
||||||
|
|
||||||
// Multibyte strings
|
// Multibyte strings
|
||||||
// int mblen(const char *s, size_t n);
|
// int mblen(const char *s, size_t n);
|
||||||
|
|
|
@ -36,7 +36,13 @@ lldiv_t lldiv(long long x, long long y) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
const void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) {
|
const void *bsearch(
|
||||||
|
const void *key,
|
||||||
|
const void *base,
|
||||||
|
size_t nmemb,
|
||||||
|
size_t size,
|
||||||
|
int (*compar)(const void *, const void *)
|
||||||
|
) {
|
||||||
size_t left = 0;
|
size_t left = 0;
|
||||||
size_t right = nmemb;
|
size_t right = nmemb;
|
||||||
|
|
||||||
|
@ -52,3 +58,26 @@ const void *bsearch(const void *key, const void *base, size_t nmemb, size_t size
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qsort(
|
||||||
|
void *base,
|
||||||
|
size_t nmemb,
|
||||||
|
size_t size,
|
||||||
|
int (*diff)(const void *, const void *)
|
||||||
|
) {
|
||||||
|
// Ima be doing bublbe sort for now
|
||||||
|
char *bytes = base;
|
||||||
|
for(size_t i = 0; i != nmemb-1; ++i) {
|
||||||
|
for(size_t j = 0; j < nmemb-i-1; ++j) {
|
||||||
|
char *this = bytes+j*size;
|
||||||
|
char *that = this+size;
|
||||||
|
if(diff(this, that) > 0) {
|
||||||
|
for(size_t b=0;b!=size;++b) {
|
||||||
|
char temp = this[b];
|
||||||
|
this[b] = that[b];
|
||||||
|
that[b] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int compare_ints(const void *p, const void *q) {
|
||||||
|
int x = *(const int *)p;
|
||||||
|
int y = *(const int *)q;
|
||||||
|
|
||||||
|
/* Avoid return x - y, which can cause undefined behaviour
|
||||||
|
because of signed integer overflow. */
|
||||||
|
if (x < y)
|
||||||
|
return -1; // Return -1 if you want ascending, 1 if you want descending order.
|
||||||
|
else if (x > y)
|
||||||
|
return 1; // Return 1 if you want ascending, -1 if you want descending order.
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
// All the logic is often alternatively written:
|
||||||
|
return (x > y) - (x < y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sort an array of n integers, pointed to by a. */
|
||||||
|
void sort_ints(int *a, size_t n) {
|
||||||
|
qsort(a, n, sizeof(*a), compare_ints);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int arr[] = {-1,10,155, 256-10,0,0,0};
|
||||||
|
int count = sizeof arr / sizeof *arr;
|
||||||
|
sort_ints(arr, count);
|
||||||
|
for(int i = 0; i != count; ++i) {
|
||||||
|
printf("%d\t", arr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue