21xrx.com
2024-09-20 05:49:23 Friday
登录
文章检索 我的文章 写文章
C++排序算法实现:不依赖数组排序
2023-06-28 14:33:12 深夜i     --     --
C++ 排序算法 不依赖数组排序

在C++中,排序算法是经常被使用的算法之一。通常我们会使用数组来进行排序,但是在某些情况下,我们需要对其他数据结构进行排序,比如链表、二叉树等等。本文将介绍如何实现不依赖数组的排序算法。

我们首先要讨论的是如何对链表进行排序。链表是由一系列节点组成的,每个节点包含了存储的值和指向下一个节点的指针。由于指针的存在,链表的操作不依赖数组的下标,因此排序算法有所不同。

一种对链表进行排序的算法是归并排序。归并排序是一种分治算法,它将一个大问题拆分成一些小问题进行递归处理,并将结果合并起来。对于链表,我们可以将它拆分成两个较小的链表进行排序,然后将它们合并。

实现过程分为以下步骤:

- 找到链表的中间节点

- 分割链表为两个子链表

- 递归对子链表进行排序

- 合并两个子链表

下面是代码实现:


//寻找中间节点

ListNode* findMiddle(ListNode* head) {

  ListNode *slow = head, *fast = head->next;

  while (fast && fast->next)

    slow = slow->next;

    fast = fast->next->next;

  

  ListNode *mid = slow->next;

  slow->next = NULL;

  return mid;

}

//合并已排序的子链表

ListNode* merge(ListNode* left, ListNode* right) {

  ListNode dummy(0);

  ListNode *tail = &dummy;

  while (left && right) {

    if (left->val < right->val)

      tail->next = left;

      left = left->next;

     else

      tail->next = right;

      right = right->next;

    

    tail = tail->next;

  }

  tail->next = left ? left : right;

  return dummy.next;

}

//归并排序

ListNode* mergeSortList(ListNode* head) {

  if (!head || !head->next)

    return head;

  

  ListNode *mid = findMiddle(head);

  ListNode *left = mergeSortList(head);

  ListNode *right = mergeSortList(mid);

  return merge(left, right);

}

除了归并排序之外,我们还可以使用快速排序对链表进行排序。快速排序使用分治的思想,通过不断地交换元素将序列分为两部分,一部分比另一部分小,然后递归处理这两部分。对于链表,我们可以通过将链表中间的元素作为枢轴来进行划分。

实现过程分为以下步骤:

- 找到链表的中间节点

- 以中间节点值为枢轴,将链表划分为两个子链表

- 对子链表进行递归排序

- 合并子链表

下面是代码实现:


//找到中间节点

ListNode* findMiddle(ListNode* head) {

  ListNode *slow = head, *fast = head->next;

  while (fast && fast->next)

    slow = slow->next;

    fast = fast->next->next;

  

  return slow;

}

//快速排序

ListNode* quickSortList(ListNode* head) {

  if (!head || !head->next)

    return head;

  

  ListNode *pivot = findMiddle(head);

  ListNode *left = new ListNode(0), *right = new ListNode(0);

  ListNode *p = left, *q = right;

  for (ListNode *cur = head; cur; cur = cur->next) {

    if (cur == pivot) continue;

    if (cur->val < pivot->val)

      p->next = cur;

      p = p->next;

     else

      q->next = cur;

      q = q->next;

    

  }

  p->next = q->next = NULL;

  left = quickSortList(left->next);

  right = quickSortList(right->next);

  pivot->next = right;

  for (p = left; p->next; p = p->next);

  p->next = pivot;

  return left;

}

除了链表之外,我们也可以对二叉树进行排序。二叉树的排序通常称为二叉查找树(BST)。它是一种有序的数据结构,左子树节点的值均小于当前节点的值,右子树节点的值均大于当前节点的值。

对于二叉树,我们可以使用递归遍历的方式进行排序。

实现过程分为以下步骤:

- 将根节点插入到BST中

- 递归地将左子节点插入到BST中

- 递归地将右子节点插入到BST中

下面是代码实现:


//将节点插入BST中

TreeNode* insertBST(TreeNode* root, int val) {

  if (!root) {

    return new TreeNode(val);

  }

  if (val < root->val) {

    root->left = insertBST(root->left, val);

  } else {

    root->right = insertBST(root->right, val);

  }

  return root;

}

//二叉树排序

TreeNode* sortBST(vector<int>& nums) {

  TreeNode *root = NULL;

  for (int i = 0; i < nums.size(); i++) {

    root = insertBST(root, nums[i]);

  }

  return root;

}

总结:

不依赖数组的排序算法可以解决在某些情况下需要对其他数据结构进行排序的问题。本文介绍了如何对链表和二叉树进行排序,通过实现不同的排序算法,我们可以扩展我们的排序算法工具箱。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复