堆排序介绍
堆排序是利用堆这种数据结构设计的一种排序算法。
堆是一种完全二叉树:
- 大顶堆:每一个节点的值都大于或等于它的左右孩子节点的值;父节点=arr[i],左孩子节点=arr[2i+1],右孩子节点=arr[2i+2];
- 小顶堆:每一个节点的值都小于或等于它的左右孩子节点的值。
堆排序思路
- 将无序序列构成一个堆,根据升序或降序选择大顶堆或者小顶堆。
- 将堆顶元素与末尾元素交换,将最大或者最小元素沉到数组末端;
- 重新调整除末尾的剩余元素,使其满足堆的结构再进行交换,循环,直到所有元素完成排序。
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] arr = {17,8,5,9,24,39};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
//将一个数组构建成一个大顶堆
// i :第一个非叶子节点,n:数组长度
public static void buildHeap(int[] arr,int i,int n){
int temp = arr[i];
for(int k=2*i+1; k<n ;k=k*2+1){
if( k+1<n &&arr[k]<arr[k+1]){
k++;
}
if(temp<arr[k]){
arr[i]=arr[k];
i=k;
}else {
break;
}
}
arr[i] = temp;
}
public static void heapSort(int[] arr){
//第一次构建大顶堆
for(int i=arr.length/2-1;i>=0;i--){
buildHeap(arr,i,arr.length);
}
//将大顶堆的首元素最大的,与末尾元素交换,再循环构建大顶堆。
for(int i=arr.length-1;i>0;i--){
int temp = arr[i];
arr[i]= arr[0];
arr[0] = temp;
buildHeap(arr,0,i);
}
}
}