heap and insertion sorts

David Medlock noone at nowhere.com
Wed Oct 25 05:58:40 PDT 2006


Ported from public domain code.


// =====================================
// insertion sort
// =====================================
template isort(T)
{
   void isort(T[] array, int delegate(T,T) compare = null)
   {
     int cmp( T x, T y ) { return x<y ? -1 : x==y ? 0 : 1 ;}

     if ( compare is null ) compare = &cmp;

     // shift elements until this value can be inserted
     void reinsert( T value, int start )
     {
       while( start >=0 )
       {
         if ( cmp(array[start], value) < 0 ) break;
         array[start+1]=array[start];
         start--;
       }
       array[start+1] = value;
     }

     for (int i = 1; i < array.length; i++)
     {
       if ( cmp(array[i-1],array[i])>0 )  reinsert( array[i] , i-1 );
     }
   }
}



// =====================================
// Heapsort
// =====================================
template hsort(T)
{
   void hsort( T[] array, int delegate(T,T) compare = null )
   {
     int cmp( T a, T b ) { return a<b ? -1 : a==b ? 0 : 1;}
     if ( compare is null ) compare = &cmp;

     int parent( int n ) { return (n&1)==0 ? (n/2)-1 : (n/2); }
     int left( int n)    { return n*2 + 1; }
     int right( int n )  { return n*2 + 2; }

     void swap( int a, int b )
     {
       T temp = array[a];
       array[a] = array[b];
       array[b] = temp;
     }

     int heapsize = array.length -1 ;

     void heapify( T[] array, int which )
     {
       int L = left(which);
       int R = right(which);
       int large = which;
       if ( L < heapsize ) if ( compare(array[L] ,array[which] ) > 0 )
       {
          large = L;
       }

       if ( L < heapsize ) if ( compare(array[R] ,array[large] ) > 0 )
       {
          large = R;
       }
       if ( large != which )
       {
         swap( large, which );
         heapify( array, large );
       }
     }

     for (int i = (heapsize-1) / 2; i >= 0; i--)
     {
       heapify(array, i);
     }

     for (int i = heapsize; i > 0; i--)
     {
       swap( 0, heapsize );
       heapsize--;
       heapify(array, 0);
     }
   }
}



More information about the Digitalmars-d mailing list