hf_again/src/base/base_sort.c

61 lines
1.4 KiB
C

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);
}