aboutsummaryrefslogtreecommitdiff
path: root/src/sort.c
diff options
context:
space:
mode:
authortlatorre <tlatorre@uchicago.edu>2019-03-04 19:07:23 -0600
committertlatorre <tlatorre@uchicago.edu>2019-03-04 19:07:23 -0600
commit1b334a7cb3cfa634d23066d8a41c813c75340fcf (patch)
treef2f45a0107fa93d6bea4f90f3883060dad376edc /src/sort.c
parent013885856d99b2ef968179b6defcc748dfa7ca69 (diff)
downloadsddm-1b334a7cb3cfa634d23066d8a41c813c75340fcf.tar.gz
sddm-1b334a7cb3cfa634d23066d8a41c813c75340fcf.tar.bz2
sddm-1b334a7cb3cfa634d23066d8a41c813c75340fcf.zip
add a function to tag flasher events
Diffstat (limited to 'src/sort.c')
-rw-r--r--src/sort.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/sort.c b/src/sort.c
new file mode 100644
index 0000000..788c757
--- /dev/null
+++ b/src/sort.c
@@ -0,0 +1,72 @@
+#include <stdlib.h>
+#include "sort.h"
+
+typedef struct fargsort_element {
+ double value;
+ size_t index;
+} fargsort_element;
+
+typedef struct argsort_element {
+ int value;
+ size_t index;
+} argsort_element;
+
+int fargsort_compare(const void *a, const void *b)
+{
+ const double da = ((fargsort_element *) a)->value;
+ const double db = ((fargsort_element *) b)->value;
+
+ return (da > db) - (da < db);
+}
+
+int argsort_compare(const void *a, const void *b)
+{
+ const int da = ((argsort_element *) a)->value;
+ const int db = ((argsort_element *) b)->value;
+
+ return (da > db) - (da < db);
+}
+
+void fargsort(double *base, size_t num, size_t *index_array)
+{
+ /* Returns the indices that would sort the array `base`. */
+ size_t i;
+ fargsort_element *array;
+
+ array = (fargsort_element *) malloc(num*sizeof(fargsort_element));
+
+ for (i = 0; i < num; i++) {
+ array[i].value = base[i];
+ array[i].index = i;
+ }
+
+ qsort(array, num, sizeof(fargsort_element), fargsort_compare);
+
+ for (i = 0; i < num; i++) {
+ index_array[i] = array[i].index;
+ }
+
+ free(array);
+}
+
+void argsort(int *base, size_t num, size_t *index_array)
+{
+ /* Returns the indices that would sort the array `base`. */
+ size_t i;
+ argsort_element *array;
+
+ array = (argsort_element *) malloc(num*sizeof(argsort_element));
+
+ for (i = 0; i < num; i++) {
+ array[i].value = base[i];
+ array[i].index = i;
+ }
+
+ qsort(array, num, sizeof(argsort_element), argsort_compare);
+
+ for (i = 0; i < num; i++) {
+ index_array[i] = array[i].index;
+ }
+
+ free(array);
+}