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