【问题标题】:Sort int queqe with restrictions排序 int queqe 有限制
【发布时间】:2017-05-07 16:11:24
【问题描述】:

我需要仅使用另一个队列、变量的最终数量并且仅使用“isEmpty”、“enqueue”、“dequeue”对队列进行排序。 我尝试了一天,但我还没有弄明白。我到处搜索,这种限制毫无疑问,你认为可能吗?

【问题讨论】:

标签: java sorting queue


【解决方案1】:

如果是在 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) 算法。 我认为您可以进行合并排序。我明天做。

【讨论】:

  • 首先非常感谢您!其次,我确信有一种方法,就像你说的那样,当你甚至不需要另一个队列时,但我的目的是(很抱歉现在这么说)算法效率低下,你认为有没有办法在小于 O(n^2) 的时间内做到这一点?
【解决方案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 个运行被合并到一个队列中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2012-09-28
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多