首页 > 编程语言 > 详细

链表的归并排序

时间:2020-10-02 13:38:34      阅读:19      评论:0      收藏:0      [点我收藏+]
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>

using namespace std;

typedef struct LNode* LinkList;
struct LNode {
    int data;
    LinkList next;
    LNode(int x = 0) { data = x, next = NULL; }
};

LinkList creatList(int n) {
    LinkList head = new LNode(n);
    LinkList p, tail = head;
    for (int i = 0; i < n; i++) {
        p = new LNode();
        cin >> p->data;
        tail->next = p;
        tail = p;
    }
    return head;
}

void unionList(LinkList head, LinkList head1, LinkList head2) {
    LinkList p = head1->next, q = head2->next, tail = head;
    int cnt1 = 0, cnt2 = 0;
    while (cnt1 < head1->data && cnt2 < head2->data) {
        if (p->data > q->data) {
            tail->next = q;
            tail = q;
            q = q->next;
            cnt2++;
        } else {
            tail->next = p;
            tail = p;
            p = p->next;
            cnt1++;
        }
    }
    if (cnt1 < head1->data) tail->next = p;
    if (cnt2 < head2->data) tail->next = q;
}

void sortList(LinkList head) {
    if (head->data <= 1) return;
    LinkList head1 = new LNode(head->data >> 1);
    LinkList head2 = new LNode(head->data - head1->data);
    head1->next = head->next;
    head2->next = head->next;
    for (int i = 0; i < head1->data; i++) head2->next = head2->next->next;
    sortList(head1);
    sortList(head2);
    unionList(head, head1, head2);
    delete (head1);
    delete (head2);
}

void printList(LinkList head) {
    LinkList p = head->next;
    int cnt = 1;
    while (cnt <= head->data) {
        cout << p->data;
        if (cnt < head->data)
            cout << ‘ ‘;
        else
            cout << ‘\n‘;
        p = p->next;
        cnt++;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(), cout.tie();
    int n;
    cin >> n;
    LinkList head = creatList(n);
    sortList(head);
    printList(head);
    return 0;
}

链表的归并排序

原文:https://www.cnblogs.com/sdutzxr/p/13760653.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!