1.堆的基本概念
堆结构是一种完全二叉树或近似完全二叉树,堆分为最大堆和最小堆(适用于只需知道最大值和最小值的场景)
最大堆:根节点都大于其孩子节点 最小堆:根节点都小于其孩子节点
一般使用数组来表示,如下图,是一个堆结构:
最大堆:
堆中根节点和孩子结点的的下标关系一般为,根节点为i,则左孩子为2*i+1,右孩子为2*i+2
堆排序的思路:
1.对一个输入数组进行最大堆初始化,采取自底向上的方式,找出三个数中最大的数值作为根节点,递归进行
2.每次将堆顶节点与最后一个结点交换,然后重新对剩下部分进行最大堆初始化
堆排序代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String line=sc.nextLine();
String[] str=line.split(" ");
int n=str.length;
int[] array=new int[n];
for(int i=0;i
=0;i--){
adjustHeap(array,i,n);
}
}
private static void adjustHeap(int[] array,int root,int n){
int largest=root;
int left=root*2+1;
int right=root*2+2;
if(left
array[largest])
largest=left;
if(right
array[largest])
largest=right;
if(largest!=root){
swap(array,largest,root);
adjustHeap(array,largest,n);
}
}
}
输入:
48 43 2 93 34 1 7 0 35 82 101
输出:
0 1 2 7 34 35 43 48 82 93 101