• 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(" ---q1.size=0,q2.size=0,qMerge is: ");
          while(!qMerge.isEmpty())
            StdOut.printf("%f ",qMerge.dequeue());
          //q1.size=1,q2 is empty
          q1.enqueue(1.0);
          qMerge=merge(q1,q2);
          StdOut.printf(" ---q1.size=1,q2.size=0,qMerge is: ");
          while(!qMerge.isEmpty())
            StdOut.printf("%.2f ",qMerge.dequeue());
          //q1 is empty,q2.size=1
          q2.enqueue(1.0);
          qMerge=merge(q1,q2);
          StdOut.printf(" ---q1.size=0,q2.size=1,qMerge is: ");
          while(!qMerge.isEmpty())
            StdOut.printf("%.2f ",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(" ---q1.size=1,q2.size=1,q1Item=q2Item,qMerge is: ");
          while(!qMerge.isEmpty())
            StdOut.printf("%.2f ",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(" ---q1.size=1,q2.size=1,q1Item<q2Item,qMerge is: ");
          while(!qMerge.isEmpty())
          StdOut.printf("%.2f ",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(" ---q1.size=1,q2.size=1,q1Item>q2Item,qMerge is: ");
          while(!qMerge.isEmpty())
            StdOut.printf("%.2f ",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(" ---q1.size=2,q2.size=1,q1Item<q2Item,qMerge is: ");
          while(!qMerge.isEmpty())
            StdOut.printf("%.2f ",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(" ---q1.size=2,q2.size=1,q1Item>q2Item,qMerge is: ");
          while(!qMerge.isEmpty())
            StdOut.printf("%.2f ",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(" ---q1.size=1,q2.size=2,q1Item<q2Item,qMerge is: ");
          while(!qMerge.isEmpty())
            StdOut.printf("%.2f ",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(" ---q1.size=1,q2.size=2,q1Item>q2Item,qMerge is: ");
          while(!qMerge.isEmpty())
            StdOut.printf("%.2f ",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(" ---q1 size is %d random double,q2 size is %d random---qMerge is sorted=%s ",q1Len,q2Len,isSorted(qMerge));

        }
       
    }

  • 相关阅读:
    C++基础知识(二)
    C++基础知识(一)
    RT-thread 设备驱动组件之IIC总线设备
    RT-thread 设备驱动组件之SPI设备
    RT thread 设备驱动组件之USART设备
    RT-thread 设备驱动组件之PIN设备
    RT-thread finsh组件工作流程
    C语言知识点
    RT-thread main函数分析
    堆和栈的区别
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9860098.html
Copyright © 2020-2023  润新知