堆的定义
堆是一颗二叉完全树,可氛围大根堆与小根堆。
- 大根堆:左右子节点的值小于其父节点的值。
- 小根堆:左右子节点的值大于父节点的值。
堆排序的实现(以数组为例,建立大根堆,父节点为a[i]时,则左右子节点分别为a[2i+1]与a[2i+2])
- 建立堆:找到第一个非叶节点,调整该以节点为跟的子树为大根堆,在一次调整其他非叶节点,直到根节点。
- 排序:将堆的根节点,与尾节点交换(即交换数组第一个节点与最后一个几点)得到最大值,在对数组出去最大值外部分进行调整,使之成为大根堆。反复进行可依次的到次,第三最大值。
实现代码如下:
public class HeapSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []arr= {6,4,5,7,3,1,2,9};
HeapSort(arr);
for(int a:arr) {
System.out.println(a);
}
}
private static void HeapSort(int[] arr) {
// TODO Auto-generated method stub
for(int i=arr.length/2;i>=0;i--) {
HeapAjust(arr,i,arr.length);
}
for(int j=arr.length-1;j>0;j--) {
swap(arr,0,j);
HeapAjust(arr,0,j);
}
}
private static void swap(int[] arr, int i, int j) {
// TODO Auto-generated method stub
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
//大根堆
private static void HeapAjust(int[] arr, int i, int length) {
// TODO Auto-generated method stu
while(i<length/2) {
int child=i*2+1;
if(child<length-1&&arr[child]<arr[child+1]) {
child++;
}
if(arr[i]<arr[child]) {
swap(arr,i,child);
i=child;
child=2*i+1;
}else {
break;
}
}
}
}