문제 설명
이중 연결 목록이 주어집니다. 병합 정렬 알고리즘을 사용하여 정렬
List: 10->20->8-17->5->13->4 Sorted list: 4->5->8->10->13->17->20
알고리즘
1. If head is NULL or list contains only one element then return list 2. Create two lists by dividing original list into 2 parts 3. Sort first and second part of list 4. Merge both sorted list
예시
#include <iostream> #include <new> #define SIZE(arr) (sizeof(arr) / sizeof(arr[0])) using namespace std; struct node { int data; struct node *next; struct node *prev; }; node *createList(int *arr, int n){ node *head, *p, *q; p = head = new node; head->data = arr[0]; head->prev = NULL; head->next = NULL; for (int i = 1; i < n; ++i) { q = new node; q->data = arr[i]; q->prev = p; q->next = NULL; p->next = q; p = q; } return head; } void displayList(node *head){ while (head != NULL) { cout << head->data << " "; head = head->next; } cout << endl; } node *mergeSortedLists(node *head1, node *head2){ node *result = NULL; if (head1 == NULL) { return head2; } if (head2 == NULL) { return head1; } if (head1->data < head2->data) { head1->next = mergeSortedLists(head1->next, head2); head1->next->prev = head1; head1->prev = NULL; return head1; } else { head2->next = mergeSortedLists(head1, head2->next); head2->next->prev = head2; head2->prev = NULL; return head2; } } void splitList(node *src, node **fRef, node **bRef){ node *fast; node *slow; slow = src; fast = src->next; while (fast != NULL) { fast = fast->next; if (fast != NULL) { slow = slow->next; fast = fast->next; } } *fRef = src; *bRef = slow->next; slow->next = NULL; } void mergeSort(node **head){ node *p = *head; node *a = NULL; node *b = NULL; if (p == NULL || p->next == NULL) { return; } splitList(p, &a, &b); mergeSort(&a); mergeSort(&b); *head = mergeSortedLists(a, b); } int main(){ int arr[] = {10, 20, 8, 17, 5, 13, 4}; node *head; head = createList(arr, SIZE(arr)); cout << "Unsorted list: " << endl; displayList(head); mergeSort(&head); cout << "Final sorted list: " << endl; displayList(head); return 0; }
출력
위의 프로그램을 컴파일하고 실행할 때. 다음 출력을 생성합니다 -
Unsorted list: 10 20 8 17 5 13 4 Final sorted list: 4 5 8 10 13 17 20