一、堆排序原理
堆可以看做是一个近似的完全二叉树,树上的每一个节点对应数组中的一个元素。除了最底层外,该树是完全充满的。而且是从左到右填充。
二叉堆可以分为两种形式:最大堆和最小堆。
堆排序的算法:利用最大堆创建函数将输入数组建成最大堆,因为数组的最大元素总在根节点A[0]中,通过把它与A[n]进行互换,我们可以让该元素放在正确的位置上。这个时候从堆中去掉节点n,在剩余的节点中原来根的孩子节点仍然最大堆,而新的根几点可能会违背最大堆行政,为了维护最大堆的性质,调用max_Heapify进行调整。重复这个过程,直到堆的大小从n-1降到1。
二、实现代码
创建最大堆类
public class HeapArray {
private int m_length;
private int m_heapSize;
private int [] m_Arrays;
public HeapArray(int [] a){
m_Arrays=new int[a.length];
m_length=a.length;
m_heapSize=a.length;
for(int i=0;i<a.length;i++){
m_Arrays[i]=a[i];
}
}
public int getHeapArray(int index){
if(index>=0 && index<m_length){
return m_Arrays[index];
}else {
return Integer.MIN_VALUE;
}
}
public void setHeapArray(int index,int value){
if(index>=0 && index<m_length){
m_Arrays[index]=value;
}
}
public void swap(int index1,int index2){
boolean flag=index1>=0&&index1<m_length;
flag=flag && index2>=0&&index2<m_length;
if(flag){
int temp=m_Arrays[index1];
m_Arrays[index1]=m_Arrays[index2];
m_Arrays[index2]=temp;
}
}
public int getLength(){
return m_length;
}
public void setHeapSize(int heapSize){
m_heapSize=heapSize;
}
public int getHeapSize(){
return m_heapSize;
}
}
堆排序
public class MaxHeap {
public final void build_Max_Heap(HeapArray A){
A.setHeapSize(A.getLength());
for(int i=A.getLength()/2;i>=0;i--){
max_Heap_Modify(A,i);
}
}
private void max_Heap_Modify(HeapArray A,int i){
int left=2*i;
int right=2*i+1;
int largest=i;
int length=A.getHeapSize()-1;
if(left<=length && A.getHeapArray(left)>A.getHeapArray(i)){
largest=left;
}
if(right<=length&&A.getHeapArray(right)>A.getHeapArray(largest)){
largest=right;
}
if(largest!=i){
A.swap(i, largest);
max_Heap_Modify(A,largest);
}
}
public final void heap_Sort(HeapArray A){
build_Max_Heap(A);
for(int i=A.getLength()-1;i>0;i--){
A.swap(0, i);
int heapSize=A.getHeapSize();
A.setHeapSize(heapSize-1);
max_Heap_Modify(A,0);
}
}
}
1828

被折叠的 条评论
为什么被折叠?



