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));
       }
    }

  • 相关阅读:
    $this是什么意思-成员变量和局部变量的调用
    神经网络 ML08 c-d-e
    机器学习笔记 ML01c
    虚函数
    C++有哪几种情况只能用初始化列表,而不能用赋值?
    C++ 的 I/O
    引用
    宏定义 #define 和常量 const 的区别
    怎么设置才能让外网ip可以访问mysql数据库[转]
    大师的框架面试总结[转]
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9860099.html
Copyright © 2011-2022 走看看