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