是否可以使用合并排序对堆栈进行排序?

劳尔

堆栈可以实现为链表。可以使用合并排序对链接列表进行排序:O(n log n)时间O(n)空间

能够使用合并排序对堆栈进行排序很有意义。

如果是这样,代码将是什么样?

(在网上快速搜索之后,我只发现了暴力算法O(n ^ 2))

什么

我们可以。诀窍在于理解,当对堆栈进行排序时,head是最大的元素-我们希望将其从低到高进行迭代。但是,可以在O(n)中反转堆栈。

reverse(stack):
   s <- new stack
   while stack.isEmpty() == false:
       s.push(stack.pop)
   return s

现在,使用它,并假设您也可以使用size(),它非常容易实现,并且是大多数堆栈实现的标准-我们可以实现合并排序:

伪代码:

mergeSort(stack):
   if stack.isEmpty():
       return stack
   s1 <- new stack
   s2 <- new stack
   //   O(n):
   while s1.size() < stack.size():
        s1.push(stack.pop())
   while (stack.isEmpty() == false):
        s2.push(stack.pop())           
   mergeSort(s1) //half the size of stack
   mergeSort(s2) //half the size of stack
   //head of s1 and s2 is the largest element
   s1 <- s1.reverse() //easily implemented in O(n)
   s2 <- s2.reverse()
   //now head of s1 and s2 is the smallest element
   while (s1.isEmpty() == false and s2.isEmpty() == false):
        if (s1.peek() < s2.peek()):
            stack.push(s1.pop())
         else:
            stack.push(s2.pop())
   //the 'tail' of one stack:
   while (s1.isEmpty() == false):
         stack.push(s1.pop())
   while (s2.isEmpty() == false):
         stack.push(s2.pop())
   //head is the largest, stacks are sorted
   return stack

正确性:
基础:stop子句是一个空堆栈,已排序。
假设:对s1和s2进行排序。
步骤:反转后,使用pop()方法取下元素时,在排序区域中,s1和s2基本按照从低到高的顺序遍历。由于我们总是从每个堆栈中插入较小的元素,并且我们从低到高遍历每个堆栈-我们得到的结果堆栈是有序的。

复杂度:
除递归调用外,每个步骤均为O(stack.size()) = O(n)这与常规合并排序的行为相同,其余复杂性遵循原始合并排序要获取的相同步骤O(nlogn)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以使用合并排序(C#)根据多个条件对数组进行排序?

来自分类Dev

使用合并排序对结构数组进行排序

来自分类Dev

使用合并排序对数组进行排序

来自分类Dev

合并排序-堆栈损坏错误

来自分类Dev

合并排序-堆栈损坏错误

来自分类Dev

合并排序会产生堆栈溢出

来自分类Dev

超出合并排序调用堆栈

来自分类Dev

合并排序堆栈溢出错误

来自分类Dev

合并排序混乱,堆栈级别太深?

来自分类Dev

使用合并排序排序(名称)

来自分类Dev

使用JS Underscore对相似数组进行key合并排序

来自分类Dev

使用合并排序/快速排序对Python中的类对象的属性进行排序

来自分类Dev

堆栈的归并排序

来自分类Dev

合并排序-使用整数数组对字符串数组进行排序

来自分类Dev

使用比较器或合并排序,对对象的arrayList进行排序哪个更好?

来自分类Dev

使用合并排序,以O(n log n)的时间对链表进行排序

来自分类Dev

合并时合并排序使用什么排序技术

来自分类Dev

合并排序与选择排序

来自分类Dev

执行合并排序算法的系统堆栈错误

来自分类Dev

分而治之:合并排序

来自分类Dev

合并排序

来自分类Dev

合并排序算法

来自分类Dev

合并排序比较

来自分类Dev

合并排序对

来自分类Dev

合并排序比较

来自分类Dev

是否可以使用新的排序描述符对NSFetchedResultsController的结果进行重新排序,而无需执行新的提取请求?

来自分类Dev

使用向量对堆栈进行排序

来自分类Dev

是否可以使用pymongo直接对子文档的mongodb数组进行排序?

来自分类Dev

测试是否可以使用orderBy对实体中的属性进行排序