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