【发布时间】:2017-05-07 16:11:24
【问题描述】:
我需要仅使用另一个队列、变量的最终数量并且仅使用“isEmpty”、“enqueue”、“dequeue”对队列进行排序。 我尝试了一天,但我还没有弄明白。我到处搜索,这种限制毫无疑问,你认为可能吗?
【问题讨论】:
-
@dm1530 -
duplicate不包括自底向上合并排序作为潜在答案。
我需要仅使用另一个队列、变量的最终数量并且仅使用“isEmpty”、“enqueue”、“dequeue”对队列进行排序。 我尝试了一天,但我还没有弄明白。我到处搜索,这种限制毫无疑问,你认为可能吗?
【问题讨论】:
duplicate 不包括自底向上合并排序作为潜在答案。
如果是在 java 中,这是一个普通的冒泡排序。
public void sort(Queue<Integer> q){
//save first num into copy
Queue<Integer> copy = new Queue<Integer>();
int length=0;
while(!q.isEmpty()){
copy.add(q.remove());
length ++;
}
int maxNum, temp;
while(!copy.isEmpty()){
maxNum=copy.remove();
temp=0;
copy.add(maxNum);
//search for the max number
for(int i=0; i<length-1; i++){
temp = copy.remove();
if(temp > maxNum) maxNum= temp;
copy.add(temp);
}
//delete it from copy and add it to q
for(int i=0; i<length; i++){
temp = copy.remove();
if(temp == max){
q.add(max);
break;
}
copy.add(temp);
}
length --;
}
}
它应该工作。 所以,解释:
count q 并将其保存为副本。 现在您可以通过复制知道其中有多少值来激怒。 所以搜索 max number ,将其插入 q 并从中删除副本。 完成之后,减少长度,因为 现在副本少了一个元素并重复直到长度==0 并且 q 已排序。
对 q 进行排序并再占用两个队列的算法如下所示: q 中的 foreach 元素 在将 q 插入副本时,找到它的最大数量。 确保您以某种方式将 q 插入到副本中,但没有最大数量 然后将其插入新的排序队列。 完成后,将副本重新插入 q 并重复直到 q 为空 最后。
该算法的重点是我们使用 一个额外的队列通过 q 激怒。 另一个是为了在刺激的同时保存结果。 因为如果我们不使用另一个队列来激怒 q 我们将无法知道何时停止刺激。
但是如果我们知道什么时候停止通过 q 刺激(知道它的长度) 我们真的不需要那个额外的队列,所以我们只能使用另一个队列。
我认为您甚至不需要另一个队列。给我吗 半小时,我会为你编写一个算法,使用 只有我们得到的队列。
当您对数组进行排序时,使用 我们目前拥有的排序算法类型, 为了在小于 O(n^2) 的时间内对其进行排序,您必须使用 O(n) 的内存; 这与说您永远不会使用最终数量的变量相同 如果你想要小于 O(n^2)。 你希望它使用最终数量的变量,所以我自动假设你只需要一个简单的 O(n^2) 算法。 我认为您可以进行合并排序。我明天做。
【讨论】:
什么是变量的最终数量?问题陈述中缺少的是如何比较每个队列的前面元素。有没有返回队列中元素个数的size函数?
对于 2 个队列,可以实现自下而上的归并排序,但每个队列需要一些变量来跟踪每个队列中的逻辑边界。逻辑边界有效地将每个队列分成两部分,前(旧)部分和后(新)部分。这是一种时间复杂度为 O(n log(n)) 的排序。
调用A和B这两个队列,A上的所有元素。如果没有size函数,将A复制到B,生成元素个数。
在 A 和 B 之间均匀地分离元素(一到 A,一到 B,...)。
合并排序重复合并来自 A 和 B 的运行,在 A 和 B 之间交替合并运行输出。在第一轮中,大小为 1 的运行被合并为大小为 2 的运行,下一轮运行大小为 2被合并以形成大小为 4 的运行,依此类推,直到最后一次通过,其中 2 个运行被合并到一个队列中。
【讨论】: