void sort_id_value_array(int *arr, int count) {
for (int *i = arr + 2 + 1; i < arr + 2 * count; i += 2) {
int *j = i - 2; while (j >= arr && *j > *i) j -= 2; if (j == i - 2) continue;
int temp[2]; j += 2;
i--; j--;
memcpy(&temp, i, sizeof(temp));
memmove(j + 2, j, (i - j) * sizeof(int));
memcpy(j, &temp, sizeof(temp));
i++;
}
}
void update_sorted_id_value_array(int *arr, int count, int id, int new_value) {
int pos;
{
int left = 0, right = count;
while (left < right) {
int mid = left + (right - left) / 2;
arr[2*mid + 1] < new_value ? (left = mid + 1) : (right = mid);
}
pos = left;
}
int idx = 0; while (arr[2*idx] != id) idx++;
if (pos != idx) {
int off = pos - idx;
if (off > 0) {
memmove(arr + 2*idx , arr + 2*idx + 2, 2 * off * sizeof(int));
pos--;
} else
memmove(arr + 2*pos + 2, arr + 2*pos , 2 * -off * sizeof(int));
arr[2*pos] = id;
}
arr[2*pos + 1] = new_value;
}
Is the form good enough? Would having a struct .id .value help with clarity?