java實現堆排序

一、堆排序原理

堆可以看做是一個近似的完全二叉樹,樹上的每一個節點對應數組中的一個元素。除了最底層外,該樹是完全充滿的。而且是從左到右填充。

二叉堆可以分爲兩種形式:最大堆和最小堆。

堆排序的算法:利用最大堆創建函數將輸入數組建成最大堆,因爲數組的最大元素總在根節點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);
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章