Comparatie intre diferite tipuri de sortari avansate. - Radix Sort - implementare in J++.
Inapoi
public class RadixSortAlgorithm extends SortAlgorithm{
Queue load_queue(java.util.Vector v,int n)
{int i;
Queue q=new Queue();
for(i=0;i<n;i++)
q.add(((Comparable)(v.elementAt(i))).value(),i);
return q;
}
void save_queue(Queue q, java.util.Vector v)
{int i;
for(i=0;!q.isEmpty();q.delq())
v.setElementAt(new SortInt(q.top_inf()),i++);
}
void sort(java.util.Vector a) throws Exception
{Queue q,q0,q1,auxq;
int mask=1,rang,i,maxr;
Comparable maxel;
q=load_queue(a,a.size());
maxel=(Comparable)(a.elementAt(0));
for(i=1;i<a.size();i++)
if(((Comparable)(a.elementAt(i))).compareTo(maxel)>0)
maxel=(Comparable)(a.elementAt(i));
maxr=(int)(Math.log(maxel.value())/Math.log(2))+1;
for(rang=0;rang<=maxr;rang++)
{ q0=new Queue();
q1=new Queue();
for(;!q.isEmpty();q.delq())
if((q.top_inf()&mask)!=0)
q1.add(q.top_inf(),q.top_idx());
else
q0.add(q.top_inf(),q.top_idx());
mask<<=1;
q0.concat(q1);
q=q0;
auxq=q.duplicate();
for(i=0;i<a.size();i++)
{if(rang==maxr)
makeidxequal(i,auxq.top_inf(),auxq.top_idx(),true);
else
makeidxequal(i,auxq.top_inf(),auxq.top_idx(),false);
auxq.delq();
}
auxq=q.duplicate();
save_queue(auxq,a);
}
}
}
class QueueElement {
int inf,idx;
QueueElement next;
}
class Queue {
QueueElement sant;
Queue()
{ sant=new QueueElement();
sant.next=null;
}
public void add(int el,int idx)
{ QueueElement crt,temp;
crt=sant;
while(crt.next!=null)
crt=crt.next;
temp=new QueueElement();
temp.inf=el;
temp.idx=idx;
temp.next=null;
crt.next=temp;
}
public void concat(Queue dest)
{ while(!dest.isEmpty())
{ add(dest.top_inf(),dest.top_idx());
dest.delq();
}
}
public boolean isEmpty()
{ return sant.next==null;
}
public int top_inf()
{ return sant.next.inf;
}
public int top_idx()
{ return sant.next.idx;
}
public void delq()
{ if(sant.next!=null)
sant.next=sant.next.next;
}
public Queue duplicate()
{ Queue tmp=new Queue();
QueueElement crt;
crt=sant.next;
while(crt!=null)
{ tmp.add(crt.inf,crt.idx);
crt=crt.next;
}
return tmp;
}
}