堆排序
堆:是一颗完全二叉树。(所以可以用数组表示)
{0,1,2,3,4,5}
0是父亲节点
1,2是0的子节点
知道父亲节点为i,则左孩子便是(2 * i)+1,右孩子是(2 * i)+2 "左孩子+1"
知道孩子节点为i,父亲节点为(i-1)/2,此处写一个是由于java自动向下取整
/**
* @author handsometaoa
* @version 1.0.0
* @ClassName HeapSort.java
* @Description TODO
* @createTime 2022年02月22日 09:33:00
*/
public class HeapSort {
//进行节点交换
public static void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
//建立大根堆(大根堆的意思是,父节点比子节点大,但同层兄弟节点不一定有序)
public static void build_heap(int[] nums,int len){
//从最后一个节点开始依次调整每个小子数的值,保证父节点比子节点大
for(int i=len-1;i>=0;i--){
int temp=i;
while(nums[temp]>nums[(temp-1)/2])
{
swap(nums,temp,(temp-1)/2);
temp=(temp-1)/2;
}
}
}
//将最大元素调整到最后面
public static void sort(int[] nums){
int len=nums.length;
for (int i=len-1;i>0;i--)
{
swap(nums,0,i);
len--;
build_heap(nums,len);
}
}
public static void main(String[] args) {
int[] nums={5,1,4,6,3,8,7};
for (int num:nums) {
System.out.print(num);
}
System.out.println();
//建立大顶堆
build_heap(nums, nums.length);
//排序
sort(nums);
for (int num:nums) {
System.out.print(num);
}
}
}
本文来自博客园,作者:帅气的涛啊,转载请注明原文链接:https://www.cnblogs.com/handsometaoa/p/15922064.html