Solution: Sorting Algorithms
Solve a task implementing an updated version of the merge-sort algorithm.
We'll cover the following...
Task
Here is the task that implements a version of the merge-sort algorithm that sorts a DLList
without using an auxiliary array.
Solution
The code implements the merge-sort algorithm for a doubly linked list.
Press + to interact
#include <iostream>#include <functional>using namespace std;template<typename T>class Node {public:T data;Node<T>* prev;Node<T>* next;Node(const T& data) : data(data), prev(nullptr), next(nullptr) {}};template<typename T>class MergeSortDLL {private:Node<T>* head;function<bool(const T&, const T&)> compare;public:MergeSortDLL(const function<bool(const T&, const T&)>& compare): head(nullptr), compare(compare) {}void add(const T& data) {Node<T>* newNode = new Node<T>(data);if (head == nullptr) {head = newNode;} else {Node<T>* current = head;while (current->next != nullptr) {current = current->next;}current->next = newNode;newNode->prev = current;}}void mergeSort() {head = mergeSort(head);}Node<T>* mergeSort(Node<T>* head) {if (head == nullptr || head->next == nullptr) {return head;}Node<T>* middle = getMiddle(head);Node<T>* nextOfMiddle = middle->next;middle->next = nullptr;Node<T>* left = mergeSort(head);Node<T>* right = mergeSort(nextOfMiddle);return merge(left, right);}Node<T>* merge(Node<T>* left, Node<T>* right) {Node<T>* result = nullptr;if (left == nullptr) {return right;}if (right == nullptr) {return left;}if (compare(left->data, right->data)) {result = left;result->next = merge(left->next, right);result->next->prev = result;} else {result = right;result->next = merge(left, right->next);result->next->prev = result;}return result;}Node<T>* getMiddle(Node<T>* head) {if (head == nullptr) {return nullptr;}Node<T>* slow = head;Node<T>* fast = head->next;while (fast != nullptr && fast->next != nullptr) {slow = slow->next;fast = fast->next->next;}return slow;}void printList() {Node<T>* current = head;while (current != nullptr) {cout << current->data << " ";current = current->next;}cout << endl;}};int main() {MergeSortDLL<int> mergeSortDLL([](const int& a, const int& b) {return a <= b;});mergeSortDLL.add(5);mergeSortDLL.add(2);mergeSortDLL.add(9);mergeSortDLL.add(1);mergeSortDLL.add(3);mergeSortDLL.add(6);cout << "Original List: ";mergeSortDLL.printList();mergeSortDLL.mergeSort();cout << "Sorted List: ";mergeSortDLL.printList();return 0;}
Explanation
Let’s focus on the detailed explanation of the code:
-
Line 22: The
MergeSortDLL
class is a template class that implements a doubly linked list and performs a merge sort algorithm on its elements. -
Line 23: The constructor of
MergeSortDLL
takes acompare()
function as a parameter. This function is used to determine the sorting order of ...