使用相同队列对队列进行排序

3as*_*awy 9 algorithm data-structures

我被问到这个问题,我认为这是可行的,但是我很难想出一个算法来做到这一点.限制是您不能使用任何其他数据结构,也不能创建另一个队列.此外,您只能使用enqueue,dequeue和peek(不是优先级队列).

Thanx为贡献:)

dav*_*vin 13

Sort(Q,n):

  for i = 0 to n-1
    min = findMin(Q, n-i, n)
    reorder(Q, min, n)
  end for

findMin(Q, k, n):

  min = infinity

  for i = 1 to n
    curr = dequeue(Q)
    if curr < min && i<=k
      min = curr
    end if
    enqueue(Q,curr)
  end for

  return min

reorder(Q, min, n):

  for i = 1 to n
    curr = dequeue(Q)
    if (curr != min) // I'm assuming that there is a way to differentiate between any two items, this isn't hard to enforce
      enqueue(Q, curr)
    end if
  end for

  enqueue(Q,min)
Run Code Online (Sandbox Code Playgroud)

升序排序,在O(n ^ 2)时间内,在空间O(1)中运行(即队列为O(n)空间,算法所需的额外空间为O(1))

说明:

本质上,我们遍历队列n次,每次迭代花费2n.

在每次迭代中,我们遍历整个队列并在相关项目数内选择最小值.因此,首先相关的项目数是n,因为我们希望它们中的最小值.下一次迭代我们想要最少的前n-1项,然后是n-2项等.因为算法将在最后堆叠这些最小值.

一旦我们找到最小值,我们需要再次迭代整个堆栈以便抓取它并将其堆叠在最后.

这里的主要思想是,一个队列后面的队列将允许我们迭代队列并检查最小/最大值,同时保留顺序.