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

posted @ 2018-10-27 09:13  修电脑的龙生  阅读(295)  评论(0编辑  收藏  举报