📌  相关文章
📜  c++ 中的 ordine crescente "senza" vettori(1)

📅  最后修改于: 2023-12-03 14:59:48.354000             🧑  作者: Mango

C++ 中的排序算法——不使用数组的升序排序

排序算法是计算机科学中的基本算法之一,它可以将一组无序的数据按照一定的规则进行排列。在 C++ 中,通过使用数组和库函数可以轻松实现排序。但如果不使用数组,该如何实现呢?本文将介绍一种基于链表的排序算法。

什么是链表?

链表是一种数据结构,它由许多个节点组成,每个节点保存了一个数据元素以及指向下一个节点的指针。在单向链表中,每个节点只知道下一个节点的位置,而不知道前一个节点的位置。如下图所示:

单向链表

算法思路

我们通过创建一个空的链表,将待排序的数字逐个插入到链表中。由于链表的逻辑结构是线性的,所以我们可以很容易地从头到尾遍历链表中的所有节点。一旦找到了一个比当前待插入的数字更大的节点,就将这个数字插入到这个节点的前面。这样,每次插入一个数字时都能保证链表中的数字是升序排列的。

代码实现

我们可以使用 C++ 中的类来实现链表。为了更加方便地进行插入操作,我们可以在链表中添加一个哨兵节点,这个节点的值为正无穷大。这样,在查找插入位置时,如果已经到达了链表的尾部,就可以直接插入到哨兵节点的前面。具体的代码实现如下:

#include <iostream>

using namespace std;

class Node {
public:
    int val;
    Node* next;
    Node(int _val) {
        val = _val;
        next = nullptr;
    }
};

class LinkedList {
public:
    LinkedList() {
        head = new Node(INT_MAX);
    }

    void insert(int val) {
        Node* cur = head;
        while (cur->next && cur->next->val < val) {
            cur = cur->next;
        }
        Node* newNode = new Node(val);
        newNode->next = cur->next;
        cur->next = newNode;
    }

    void print() {
        Node* cur = head->next;
        while (cur) {
            cout << cur->val << " ";
            cur = cur->next;
        }
        cout << endl;
    }

private:
    Node* head;
};

int main() {
    LinkedList list;
    list.insert(3);
    list.insert(1);
    list.insert(4);
    list.insert(1);
    list.insert(5);
    list.print();
    return 0;
}
总结

通过本文的介绍,我们学习了如何使用链表来实现 C++ 中的升序排序算法。相较于数组和 STL 等容器,链表算法更加具有灵活性和可塑性。但是,链表算法的缺点是其访问和定位元素的速度较慢。因此,在实际开发中,我们需要根据具体的业务场景和性能需求来选择使用何种数据结构来实现排序算法。