U64 qsort_partition_F64(SortPair_F64 *pairs, U64 size, U64 low, U64 high) { F64 pivot = pairs[high].value; U64 i = low - 1; SortPair_F64 temp = {0}; for (U64 j = low; j < high; j++) { if (pairs[j].value <= pivot) { i += 1; temp = pairs[i]; pairs[i] = pairs[j]; pairs[j] = temp; } } U64 final_pivot_pos = i + 1; temp = pairs[final_pivot_pos]; pairs[final_pivot_pos] = pairs[high]; pairs[high] = temp; return final_pivot_pos; } function void qsort_F64(SortPair_F64 *pairs, U64 size, U64 low, U64 high) { if (low < high) { U64 pivot_index = qsort_partition_F64(pairs, size, low, high); qsort_F64(pairs, size, low, pivot_index - 1); qsort_F64(pairs, size, pivot_index + 1, high); } } function void sort_and_get_indices_F64(F64 *array, U64 *indices, U64 size) { SortPair_F64 *pairs = malloc(size * sizeof(SortPair_F64)); for (U64 i = 0; i < size; i++) { pairs[i].value = array[i]; pairs[i].original_index = i; } qsort_F64(pairs, size, 0, size - 1); for (U32 i = 0; i < size; i++) { array[i] = pairs[i].value; indices[i] = pairs[i].original_index; } free(pairs); } function void sort_by_indices_F64(F64 *array, U64 *indices, U64 size) { F64 *temp = malloc(size * sizeof(F64)); for (U64 i = 0; i < size; i++) { U64 original_index = indices[i]; temp[i] = array[original_index]; } for (U64 i = 0; i < size; i++) { array[i] = temp[i]; } free(temp); }