Algs4-2.2.14归并有序的队列

2.2.14归并有序的队列。编写一个静态方法,将两个有序的队列作为参数,返回一个归并后的有序队列。
答:
1)队1,队2均为0长队列时返回一个0长队列.
2)队1长度大于0,队2为0时返回队1.
3)队1长度为0,队2长度大于0时返回队2.
4)队1,队2长度均大于0时
    4.1)队1,队2分别出列q1Item,q2Item
    4.2)当q1Item<q2Item时将q1Item加入到合并队列qMerge,并标记下次从队1中出列.
    4.3)当q1Item>=q2Item时将q2Item加入到合并队列qMerge,并标记下次从队2中出列.
    4.4)当下次从队1中出列,并且队1还有剩余项时从队1中出列,然后再跳到4.1进行对比.
    4.5)当下次从队2中出列,并且队2还有剩余项时从队2中出列,然后再跳到4.1进行对比.
    4.6)当下次从队1中出列,但队1已为空,这里q2Item成为孤立项,直接加入到合并队列qMerge中.此时无论队2是不是空都将队2中所有的项加入到合并队列,此时队1和队2均为空,结束合并.
    4.6)当下次从队2出列,但队2已为空,这里q1Item成为孤立项,直接加入到合并队列qMerge中,此时无论队1是不是空都将队1中所有的项加入到合并队列,此时队1和队2均为空,结束合并.
图片
import java.util.Arrays;
public  class E2d2d14
{
    public static Queue<Comparable> merge(Queue<Comparable> q1,Queue<Comparable> q2)
    {
        Queue<Comparable> qMerge=new Queue<Comparable>();
        boolean nextIsQ1=false;
        if (q1.isEmpty() && q2.isEmpty())
            return qMerge;
        else if (!q1.isEmpty() && q2.isEmpty())
            return q1;
        else if(q1.isEmpty() && !q2.isEmpty())
            return q2;
        else//!q1.isEmpty() && !q2.isEmpty())
        {
            Comparable q1Item=q1.dequeue();
            Comparable q2Item=q2.dequeue();
            while(true)
                {
                    if(less(q1Item,q2Item))
                      {
                        qMerge.enqueue(q1Item);
                        nextIsQ1=true;
                     }
                    else
                     {
                       qMerge.enqueue(q2Item);
                       nextIsQ1=false;
                    }
                    //
                    if(nextIsQ1 && !q1.isEmpty())
                      q1Item=q1.dequeue();
                    else if(!nextIsQ1 && !q2.isEmpty())
                      q2Item=q2.dequeue();
                    else if(nextIsQ1 && q1.isEmpty())
                    {
                      qMerge.enqueue(q2Item);
                      while(!q2.isEmpty()) qMerge.enqueue(q2.dequeue());
                      return qMerge;//exit while
                    }
                    else if(!nextIsQ1 && q2.isEmpty())
                    {
                      qMerge.enqueue(q1Item);
                      while(!q1.isEmpty()) qMerge.enqueue(q1.dequeue());
                      return qMerge;//exit while
                    }
                }//end while
            }//end else   
      }//end sort
   
    public static boolean isSorted(Queue<Comparable> q)
    {
      if (q.size()<2) return true;
      Comparable one,two;
      one=q.dequeue();
     
      while(!q.isEmpty())
      {
        two=q.dequeue();
        if(less(two,one)) return false;
        one=two;
      }
      return true;
    }
    private static boolean less(Comparable v,Comparable w)
    {
        return v.compareTo(w)<0;
    }
   
    public static void main(String[] args)
    {
      Integer q1Len=Integer.parseInt(args[0]);
      Integer q2Len=Integer.parseInt(args[1]);
      Queue<Comparable> q1=new Queue<Comparable>();
      Queue<Comparable> q2=new Queue<Comparable>();
      //q1,q2 is empty
      Queue<Comparable> qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=0,q2.size=0,qMerge is:\n");
      while(!qMerge.isEmpty())
        StdOut.printf("%f\n",qMerge.dequeue());
      //q1.size=1,q2 is empty
      q1.enqueue(1.0);
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=1,q2.size=0,qMerge is:\n");
      while(!qMerge.isEmpty())
        StdOut.printf("%.2f\n",qMerge.dequeue());
      //q1 is empty,q2.size=1
      q2.enqueue(1.0);
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=0,q2.size=1,qMerge is:\n");
      while(!qMerge.isEmpty())
        StdOut.printf("%.2f\n",qMerge.dequeue());
      //q1.size=1,q2.size=1 and q1Item=q2Item
      q1.enqueue(1.0);
      q2.enqueue(1.0);
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=1,q2.size=1,q1Item=q2Item,qMerge is:\n");
      while(!qMerge.isEmpty())
        StdOut.printf("%.2f\n",qMerge.dequeue());
      //q1.size=1,q2.size=1 and q1Item<q2Item
      q1.enqueue(1.0);
      q2.enqueue(2.0);
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=1,q2.size=1,q1Item<q2Item,qMerge is:\n");
      while(!qMerge.isEmpty())
      StdOut.printf("%.2f\n",qMerge.dequeue());
      //q1.size=1,q2.size=1 and q1Item>q2Item
      q1.enqueue(2.0);
      q2.enqueue(1.0);
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=1,q2.size=1,q1Item>q2Item,qMerge is:\n");
      while(!qMerge.isEmpty())
        StdOut.printf("%.2f\n",qMerge.dequeue());
      //q1.size=2,q2.size=1 and q1Item<q2Item
      q1.enqueue(1.0);
      q1.enqueue(2.0);
      q2.enqueue(3.0);
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=2,q2.size=1,q1Item<q2Item,qMerge is:\n");
      while(!qMerge.isEmpty())
        StdOut.printf("%.2f\n",qMerge.dequeue());
      //q1.size=2,q2.size=1 and q1Item>q2Item
      q1.enqueue(1.0);
      q1.enqueue(2.0);
      q2.enqueue(0.5);
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=2,q2.size=1,q1Item>q2Item,qMerge is:\n");
      while(!qMerge.isEmpty())
        StdOut.printf("%.2f\n",qMerge.dequeue());
       //q1.size=1,q2.size=2 and q1Item<q2Item
      q1.enqueue(1.0);
      q2.enqueue(2.0);
      q2.enqueue(3.0);
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=1,q2.size=2,q1Item<q2Item,qMerge is:\n");
      while(!qMerge.isEmpty())
        StdOut.printf("%.2f\n",qMerge.dequeue());
      //q1.size=1,q2.size=2 and q1Item>q2Item
      q1.enqueue(4.0);
      q2.enqueue(2.0);
      q2.enqueue(3.0);
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1.size=1,q2.size=2,q1Item>q2Item,qMerge is:\n");
      while(!qMerge.isEmpty())
        StdOut.printf("%.2f\n",qMerge.dequeue());
      //q1.size=q1Len,q2.size=q2Len and random double
      Double[] a=new Double[q1Len];
      Double[] b=new Double[q2Len];
      for(int i=0;i<q1Len;i++)
        a[i]=StdRandom.uniform();
      for(int i=0;i<q2Len;i++)
        b[i]=StdRandom.uniform();
      //
      Arrays.sort(a);
      Arrays.sort(b);
      for(int i=0;i<q1Len;i++)
        q1.enqueue(a[i]);
      for(int i=0;i<q2Len;i++)
        q2.enqueue(b[i]);
      //
      qMerge=merge(q1,q2);
      StdOut.printf("\n---q1 size is %d random double,q2 size is %d random---qMerge is sorted=%s\n",q1Len,q2Len,isSorted(qMerge));

    }
   
}

猜你喜欢

转载自www.cnblogs.com/longjin2018/p/9860098.html