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);
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值