package org.rut.util.algorithm.support; |
import org.rut.util.algorithm.SortUtil; |
/** |
* @author treeroot |
* @since 2006-2-2 |
* @version 1.0 |
*/ |
public class HeapSort implements SortUtil.Sort{ |
/* (non-Javadoc) |
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) |
*/ |
public void sort( int [] data) { |
MaxHeap h= new MaxHeap(); |
h.init(data); |
for ( int i= 0 ;i<data.length;i++) |
h.remove(); |
System.arraycopy(h.queue, 1 ,data, 0 ,data.length); |
} |
private static class MaxHeap{ |
|
|
void init( int [] data){ |
this .queue= new int [data.length+ 1 ]; |
for ( int i= 0 ;i<data.length;i++){ |
queue[++size]=data[i]; |
fixUp(size); |
} |
} |
|
private int size= 0 ; |
private int [] queue; |
|
public int get() { |
return queue[ 1 ]; |
} |
public void remove() { |
SortUtil.swap(queue, 1 ,size--); |
fixDown( 1 ); |
} |
//fixdown |
private void fixDown( int k) { |
int j; |
while ((j = k << 1 ) <= size) { |
if (j < size && queue[j]<queue[j+ 1 ]) |
j++; |
if (queue[k]>queue[j]) //不用交换 |
break ; |
SortUtil.swap(queue,j,k); |
k = j; |
} |
} |
private void fixUp( int k) { |
while (k > 1 ) { |
int j = k >> 1 ; |
if (queue[j]>queue[k]) |
break ; |
SortUtil.swap(queue,j,k); |
k = j; |
} |
} |
} |
} |