Я думаю, вам нужно сделать большой шаг назад и решить проблему в целом - велика вероятность, что полусортированный кольцевой буфер - не лучший способ для хранения ваших данных. Если это так, то вы уже зафиксированы, и вам нужно будет написать буфер для сортировки элементов - означает ли это, что вы выполняете случайную сортировку с внешней библиотекой или делаете это, когда вставляются элементы, я не знаю. Но в конце концов это будет ужасно, потому что FIFO и отсортированный буфер принципиально отличаются.
Предыдущий ответ, который предполагает, что ваша библиотека сортировки имеет надежный и функциональный API-интерфейс (как и требовалось в вашем вопросе, это не требует написания собственного мода для сортировки или чего-либо еще - это зависит от библиотеки, поддерживающей произвольно расположенные данные, обычно через функцию обратного вызова. Если ваш вид не поддерживает связанные списки, он не может обработать это):
Круговой буфер уже решил эту проблему, используя арифметику% (mod). QSort и т. Д. Не заботятся о местах в памяти - им просто нужна схема для линейного обращения с данными.
Они работают также для связанных списков (которые не являются линейными в памяти), как для «реальных» линейных некруговых массивов.
Так что, если у вас есть круговой массив с 100 записями, и вы обнаружите, что вам нужно отсортировать первые 10, а первые десять попали в верхнюю часть, то вы передадите сортировке следующие два бита информации:
- Функция поиска элемента массива: (x% 100)
- Предметы для сортировки находятся в местах от 95 до 105
Функция преобразует адреса, используемые сортировкой, в индекс, используемый в реальном массиве, и тот факт, что массив оборачивается, скрыт, хотя сортировка массива за его пределы может показаться странным, определение, не имеет границ. Оператор% справится с этим за вас, и вы можете также сослаться на часть массива с 1295 по 1305 для всех своих забот.
Бонусные баллы за массив с 2 ^ n элементами.
Дополнительные вопросы для рассмотрения:
Мне кажется, что вы используете библиотеку сортировки, которая не способна сортировать что-либо, кроме линейного массива - поэтому она не может сортировать связанные списки или массивы с чем-либо, кроме простого упорядочения. У вас действительно есть только три варианта:
- Вы можете переписать библиотеку, чтобы сделать ее более гибкой (т. Е. Когда вы вызываете ее, вы предоставляете ей набор указателей на функции для операций сравнения и операций доступа к данным)
- Вы можете переписать ваш массив так, чтобы он как-то подходил вашим существующим библиотекам
- Вы можете написать собственные сортировки для вашего конкретного решения.
Теперь, со своей стороны, я бы переписал код сортировки, чтобы он был более гибким (или продублировал его и отредактировал новую копию, чтобы у вас были сортировки, которые быстры для линейных массивов, и сортировки, которые гибки для не линейные массивы)
Но реальность такова, что сейчас ваша библиотека сортировки настолько проста, что вы даже не можете сказать ей, как получить доступ к данным, которые хранятся нелинейно.
Если это так просто, не нужно сомневаться в том, чтобы адаптировать саму библиотеку к вашим конкретным потребностям или адаптировать ваш буфер к библиотеке.
Попытка создания уродливого клуджа, например, как-то превратить ваш буфер в линейный массив, отсортировать его, а затем снова поместить в него - это всего лишь уродливый клудж, который вы должны будете понять и поддержать позже. Вы собираетесь «вломиться» в свой FIFO и возиться с внутренностями.
-Adam