堆排序

堆:是一颗完全二叉树。(所以可以用数组表示)

{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);
        }
    }
}

posted @ 2022-02-22 10:47  帅气的涛啊  阅读(19)  评论(0编辑  收藏  举报