• 链表快速排序(已通过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;
    }
    
  • 相关阅读:
    fidller 打断点
    随笔
    HTML标签介绍
    补充9.27----9.28
    html5_______9.26
    9.14
    9.13笔记
    9.12笔记
    CSS样式的引用
    html5_______9.10
  • 原文地址:https://www.cnblogs.com/Q1143316492/p/10428781.html
Copyright © 2020-2023  润新知