大顶堆的简单实现(java)

堆的实现主要有两点:

(1)建堆,将一个无序序列建成一个堆。

(2)在输出堆顶元素之后,调整剩余元素成为一个新的堆。

  这两个过程主要做了同一件事情,就是堆的调整,即将当前节点与其左右子节点进行比较,选出最大的元素值并与当前节点值交换(若当前节点最大,则不用交换)。

   具体代码实现:

//java 大顶堆的简单实现
import java.util.Arrays;
public class Heap{
	public void heapSort(int[] num){
		int n = num.length;
		for(int i = n/2;i>=0;i--){   //建堆,从n/2开始向上调整
			adjustHeap(num, i, n);
		}
		for(int j=n-1;j>=0;j--){
			swap(num,0, j);         //交换开始和最后位置上的数字
			adjustHeap(num, 0, j);    //交换之后再调整堆
		}
	}
	public void adjustHeap(int[] num,int s,int n){  //由于根节点编号是从0开始的,所以其左子树是2*i+1
		for(int i=s;inum[max]) max = 2*i+1;
			if((2*i+2)num[max]) max = 2*i+2;
			if(max!=i){
				swap(num,i,max);   
				i=max;
			}else break;
			
		}
		
	}
	public void swap(int[] num,int i,int j){
		int tem = num[i];
		num[i] = num[j];
		num[j] = tem;
	}
     public static void main(String[] args) {
		Heap heap = new Heap();
		int[] num = new int[]{49,38,65,97,76,13,27,49};
		heap.heapSort(num);
		System.out.println(Arrays.toString(num));
	}
}



你可能感兴趣的:(大顶堆的简单实现(java))