Спецификации назначения:
Следующая задача требует объединить два списка (x1, ... , xm) и (x_(m +1), ..., x_n), которые уже отсортированы, в отсортированный список (x_l, ..., x_n). Пусть s = Floor(sqrt(n)). Предположим, что в одном из этих списков меньше s записей и первый список короче второго. Нас просят написать функцию, объединяющую два отсортированных списка. Эта функция слияния должна использовать функцию roundShiftRight(), которая сдвигает записи по кругу вправо на p позиций. Если в первом списке меньше s элементов, то мы должны найти позицию q в объединенном списке первого элемента первого списка. Затем мы должны выполнить круговой сдвиг на q - 1 позицию, используя функцию roundShiftRight(). В этом циклическом сдвиге участвуют только записи первого списка и первые q — 1 записи второго. После циклического сдвига первые q записей оказываются в своих окончательных объединенных позициях. Повторите этот процесс для второго, третьего и остальных элементов исходного первого списка.
Это MRE ниже:
Код: Выделить всё
#include
#include
class Element {
public:
int getKey() const { return key; }
void setKey(int k) { key = k; }
Element(int k = 0) : key(k) {}
private:
int key;
};
void reverseSegment(Element* arr, int start, int end) {
while (start < end) {
int tempKey = arr[start].getKey();
arr[start].setKey(arr[end].getKey());
arr[end].setKey(tempKey);
start++;
end--;
}
}
void circularShiftRight(Element* arr, int n, int p) {
if (n
Подробнее здесь: [url]https://stackoverflow.com/questions/79221622/debugging-algorithm-that-merges-two-lists-that-are-already-sorted-using-circular[/url]