排序算法之堆排序

package com.person.tree;
import java.util.Arrays;
/**
 * 大顶堆 ...  堆排序
 */
public class TreeSort {
    public static void main(String[] args) {
        int[] data = {9,6,8,7,0,1,10,4,2};
        /*//开始位置是最后一个非叶子节点 就是最后一个节点的父节点
        int start = (data.length-1) / 2;
        //结束位置  数据的长度-1
        for(int i = start; i >= 0; i--){
            topShow(data,data.length,i);
        }
        System.out.print(Arrays.toString(data));*/
        sort(data);
        System.out.print(Arrays.toString(data));
    }
    //堆排序
    public static void sort(int[] data){
        //开始位置是最后一个非叶子节点 就是最后一个节点的父节点
        int start = (data.length - 1) /2;
        //调整为大顶堆
        for(int i = start; i >= 0; i--){
            topShow(data,data.length,i);
        }
        //先把数组中的第0个和堆中的最后一个数交换位置,再把前面的处理为大顶堆
        for(int i = data.length-1; i > 0; i--){
            int temp = data[0];
            data[0] = data[i];
            data[i] = temp;
            topShow(data,i,0);
        }
    }
    //大顶堆
    public static void topShow(int[] data,int size,int index){
        int leftNode = index * 2 + 1;
        int rightNode = index * 2 + 2;
        int max = index;
        if(leftNode < size && data[max] < data[leftNode]){
            max = leftNode;
        }
        if(rightNode < size && data[max] < data[rightNode]){
            max = rightNode;
        }
        if(max != index){
            int temp = data[index];
            data[index] = data[max];
            data[max] = temp;
            topShow(data,size,max);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值