【问题标题】:how to implement quicksort for linkedlist in c [duplicate]如何在c中为链表实现快速排序[重复]
【发布时间】:2014-07-30 17:31:14
【问题描述】:

我必须为单链表实现快速排序,双链表的快速排序可以使用 cormen 中指定的算法实现,因为节点具有指向下一个和前一个元素的指针,但我不知道为链表实现快速排序。我已经搜索了互联网,但找不到任何有用的东西。任何伪代码或建议都会非常有帮助。

【问题讨论】:

  • 你搜索了什么?我尝试了“双向链表快速排序 c”,它想出了 oodles。替换您选择的语言。
  • 感谢回复,我已编辑帖子

标签: algorithm sorting linked-list quicksort


【解决方案1】:

首先只使用前向迭代器对数组实现快速排序。 这是分区步骤。 您维护的不变量如下: a[0] 是枢轴元素 我们有两个迭代器(索引)i 和 j。 对于 0 = pivot 。 k >= i 的元素是未知的。 现在如果 a[i] >= pivot,增加 i。 如果 a[i]

当你为数组工作时,将算法“翻译”为单链表。

【讨论】:

  • 这是你在 c int partition(int a[], int l, int r) {pivot = a[l];整数 i, j;我 = l; j = l; while (i = pivot) i++; else swap(a[i++], a[j++])} return j;} 那么我认为这不会为这个 6 个元素 4 2 3 1 5 0 的示例提供正确的分区,因为最终分区变为 2 3 1 0 5 4 ....如果我错了,请纠正我
  • for 循环(在你的情况下)以 i = 6 和 j = 5 结束。数组是 4 2 3 1 0 5。现在你交换 a[0] 和 a[j- 1] 并得到 0 2 3 1 4 5。在此之后,您对子数组 0 2 3 1 和 5 进行递归。
  • 你为什么使用这个数组是 4 2 3 1 0 5,我的数组是 4 2 3 1 5 0,你是如何交换 a[0] 和 a[j-1] 的,根据算法请解释
  • 原始数组是 4 2 3 1 5 0。4 是枢轴。在我们到达 i = 5 之前,不会交换任何元素。当 i = 5 时,j = 4。现在作为 a[5]
  • 但是a[1]、a[2]、a[3]都比pivot小,为什么不把它们交换一下,然后j和i会增加呢?
猜你喜欢
  • 2021-07-30
  • 2019-11-20
  • 1970-01-01
  • 2014-04-25
  • 2015-07-16
  • 2011-03-29
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多