链表快速排序(已通过ACM在线评测)

链表快速排序(已通过ACM在线评测)

写这个主要是为了面试吧。复习下链表操作,既然链表快排就是拿来交互指针的,交互数据数据部分过大拷贝消耗怎么办?网上一些实现在这方面比较 扯淡。怎么好多直接swap(value1, value2) 的。。。

数组快排比较好写,就是要方便,一种取巧的方法(本文不是这种方法),一个数组,每个数组是一个结构体,包括指针,和对应拿来比较的值。这样拿去数组快排,然后按照快排后数组的指针信息重建链表。需要的额外空间就不大了。

下面是传统的递归快排。快排选择比key小的在key前面全都用指针交换实现。

#include <bits/stdc++.h>

using namespace std;

struct LinkNode {
    int val;
    LinkNode *next;
    LinkNode(int _v = 0):val(_v), next(nullptr) {}
};

LinkNode* init_random_list(const vector<int>& init_list) {
    if(init_list.size() == 0) {
        return nullptr;
    }
    auto it = init_list.begin();
    LinkNode *head = new LinkNode(*it);
    LinkNode *tmp = head;
    for(++it; it != init_list.end(); it++ ) {
        tmp->next = new LinkNode(*it);
        tmp = tmp->next;
    }
    return head;
}

void print_linklist(LinkNode *p) {
    bool first = true;
    while(p) {
        if(first) {
            first = false;
        } else {
            printf(" ");
        }
        cout << p->val;
        p = p->next;
    }
    cout << endl;
}

void quick_sort(LinkNode *lef, LinkNode *rig) {
    if(lef->next == rig) {
        return ;
    }
    LinkNode* p = lef, *q, *pos = lef->next;
    while(p->next != rig) {
        if(p->next->val < pos->val) {
            q = p->next;
            p->next = q->next;
            q->next = lef->next;
            lef->next = q;
        } else {
            p = p->next;
        }
    }
    quick_sort(lef, pos);
    quick_sort(pos, rig);
}

LinkNode* sort_linklist(LinkNode *p) {
    LinkNode* head = new LinkNode(), *q;
    head->next = p;
    quick_sort(head, nullptr);
    q = head;
    head = head->next;
    delete q;
    return head;
}

void delete_link(LinkNode *p) {
    if(p == nullptr) {
        return ;
    }
    delete_link(p->next);
    delete p;
}

int main()
{
    int n;
    while(~scanf("%d", &n)) {
        LinkNode *head = nullptr, *p = head;
        for(int i = 1; i <= n; i++ ) {
            int x;
            scanf("%d", &x);
            if(head == nullptr) {
                head = new LinkNode(x);
                p = head;
            } else {
                p->next = new LinkNode(x);
                p = p->next;
            }
        }
        head = sort_linklist(head);
        print_linklist(head);
        delete_link(head);
    }

    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务