/**
* @Description 堆排序
* 对排序是将集合转化成二叉树的一种排序方式 其中有大顶堆(每个结点的值都大于或等于其左右孩子结点的值)和
* 小顶对(每个结点的值都小于或等于其左右孩子结点的值),一般升序用大顶堆,降序用小顶堆
* @auther Eleven
* @create 2020-04-05 21:57
**/
public class HeadSort {
public static void main(String[] args) {
int[] arr = new int[]{9,6,8,7,0,1,10,4,2};
HeadSort headSort = new HeadSort();
headSort.headSort(arr);
System.out.println(Arrays.toString(arr));
}
public void headSort(int[] arr){
//开始的位置是最后一个非叶子节点,即最后一个父节点
int start = (arr.length-1)/2;
//调整为大顶堆
for (int i= start;i>=0;i--){
maxHead(arr,arr.length,i);
}
//
for (int i = arr.length-1;i>0;i--){
int temp=arr[0];
arr[0] = arr[i];
arr[i] = temp;
maxHead(arr,i,0);
}
}
public void maxHead(int[] arr,int size,int index){
//左子节点
int left = 2*index+1;
//右子节点
int right = 2*index+2;
int max = index;
//和两个字节点分别比较,得到最大数据
if (left<size && arr[left]>arr[max]){
max=left;
}
if ( right<size && arr[right]>arr[max]){
max = right;
}
//交换位置
if ( max !=index){
int temp = arr[index];
arr[index] =arr[max];
arr[max] = temp;
//交换位置以后,可能会破坏之前排好的堆,所以需要重新调整
maxHead(arr,size,max);
}
}
}
以上代码觉得不是很好,待后期改进
堆排序演示图解