61 lines
1.4 KiB
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);
|
|
}
|