digitalmars.D - heap and insertion sorts
- David Medlock (77/77) Oct 25 2006 Ported from public domain code.
- Sean Kelly (4/37) Oct 25 2006 This too.
- David Medlock (3/50) Oct 25 2006 Hehehe.
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);
}
}
}
Oct 25 2006
David Medlock wrote: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;This should be 'compare'.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 );This too.} } }Sean
Oct 25 2006
Sean Kelly wrote:David Medlock wrote:Hehehe. Thanks Sean.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;This should be 'compare'.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 );This too.} } }Sean
Oct 25 2006








David Medlock <noone nowhere.com>