双向链表上快速排序的 Javascript 程序
以下是数组快速排序的典型递归实现。该实现使用最后一个元素作为枢轴。
Javascript
Javascript
我们可以对链表使用相同的算法吗?
以下是双向链表的 C++ 实现。这个想法很简单,我们首先找出指向最后一个节点的指针。一旦我们有了指向最后一个节点的指针,我们就可以使用指向链表的第一个和最后一个节点的指针对链表进行递归排序,类似于上面传递第一个和最后一个数组元素的索引的递归函数。链表的分区函数也类似于数组的分区。它不是返回枢轴元素的索引,而是返回一个指向枢轴元素的指针。在下面的实现中,quickSort() 只是一个包装函数,主要的递归函数是_quickSort(),类似于数组实现的quickSort()。
Javascript
输出 :
Linked List before sorting
30 3 4 20 5
Linked List after sorting
3 4 5 20 30
时间复杂度:上述实现的时间复杂度与数组的 QuickSort() 的时间复杂度相同。在最坏情况下需要 O(n^2) 时间,在平均和最佳情况下需要 O(nLogn)。最坏的情况发生在链表已经排序时。
我们可以为链表实现随机快速排序吗?
只有当我们可以选择一个固定点作为枢轴(如上述实现中的最后一个元素)时,才能为链表实现快速排序。随机快速排序无法通过选择随机枢轴有效地为链表实现。
有关详细信息,请参阅双向链表上有关快速排序的完整文章!