zoukankan      html  css  js  c++  java
  • Algs4-2.2.15自底向上的有序队列归并排序

     2.2.15自底向上的有序队列归并排序。用下面的方法编写一个自底向上的归并排序:给定N个元素,创建N个队列,每个队列包含其中一个元素。创建一个由这N个队列组成的队列,然后不断用练习2.2.14中的方法将队列的头两个元素归并,并将幸福空间要重新加入到队列结尾,直到队列的队列只剩下一个元素为止。
    图片
    import java.util.Arrays;
    public  class E2d2d15
    {
        public static void sort(Queue<Queue> q)
        {
          Queue<Comparable> q1,q2;
          while(q.size()>1)
          {
            q1=q.dequeue();
            q2=q.dequeue();
            q.enqueue(merge(q1,q2));
          }
        }
        private 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 N=Integer.parseInt(args[0]);
          Queue<Queue> q=new Queue<Queue>();
          for(int i=0;i<N;i++)
          {
            Queue<Comparable> qOneItem=new Queue<Comparable>();
            qOneItem.enqueue(StdRandom.uniform());
            q.enqueue(qOneItem);
          }
          sort(q);
          Queue<Comparable> qItem=q.dequeue();
          StdOut.printf("q size is:%d,q.q is sorted=%s",qItem.size(),isSorted(qItem));
       }
    }

  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9860099.html
Copyright © 2011-2022 走看看