鏈表快速排序(已經過ACM在線評測)

鏈表快速排序(已經過ACM在線評測)

寫這個主要是爲了面試吧。複習下鏈表操做,既然鏈表快排就是拿來交互指針的,交互數據數據部分過大拷貝消耗怎麼辦?網上一些實如今這方面比較 扯淡。怎麼好多直接swap(value1, value2) 的。。。c++

數組快排比較好寫,就是要方便,一種取巧的方法(本文不是這種方法),一個數組,每一個數組是一個結構體,包括指針,和對應拿來比較的值。這樣拿去數組快排,而後按照快排後數組的指針信息重建鏈表。須要的額外空間就不大了。面試

下面是傳統的遞歸快排。快排選擇比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;
}
相關文章
相關標籤/搜索