大顶堆积排序--Java版

目录

1、介绍

2、步骤解说

3、图解

4、代码展示

5、结果展示

————————————————————————————–

1、介绍

提前参考: Java实现大顶堆和小顶堆
http://blog.csdn.net/silentwolfyh/article/details/77099258

介绍:先将数组按照【大顶堆】排序,接着一个一个移除【顶节点】

2、步骤解说

1、看明白Java实现大顶堆和小顶堆
2、在“//堆积排序”过程中,将堆顶的最大值和最后节点交换
3、调用ad_heap方法,重新设置最大堆
4、尾部节点的坐标每次执行一次加一,所有最大值就在最后

3、图解

这里写图片描述

4、代码展示

package com.datastructure.solr;


/***
 * 需求:堆积排序法
 * 
 * 提前参考: Java实现大顶堆和小顶堆 
 * http://blog.csdn.net/silentwolfyh/article/details/77099258
 * 
 * 步骤:
 * 1、看明白Java实现大顶堆和小顶堆 
 * 2、在“//堆积排序”过程中,将堆顶的最大值和最后节点交换
 * 3、调用ad_heap方法,重新设置最大堆
 * 4、尾部节点的坐标每次执行一次加一,所有最大值就在最后
 */

import java.io.*;
public  class HeapSort
{
public static void main(String args[]) throws IOException
   {
    int i,size,data[]={0,70,10,50,30,40,20,60}; //原始数组内容
    size=data.length;
    System.out.print("原始数组:");
    for(i=1;i<size;i++)
        System.out.print("["+data[i]+"] ");
    HeapSort.heap(data,size);           //建立堆积树
    System.out.print("\n"+"\n排序结果:");
    for(i=1;i<size;i++)
        System.out.print("["+data[i]+"] ");

   }

public static void heap(int data[] ,int size)
{
    int i,j,tmp;
    for(i=(size/2);i>0;i--)             //建立堆积树节点   
        HeapSort.ad_heap(data,i,size-1);
    System.out.print("\n大顶堆内容:");
    for(i=1;i<size;i++)             //原始堆积树内容
        System.out.print("["+data[i]+"] ");
    System.out.print("\n");
    for(i=size-2;i>0;i--)               //堆积排序
    {  
        tmp=data[i+1];              //头尾节点交换
        data[i+1]=data[1];
        data[1]=tmp;
        HeapSort.ad_heap(data,1,i);             //处理剩余节点
        System.out.print("\n大顶堆过程:");
        for(j=1;j<size;j++)
            System.out.print("["+data[j]+"] ");
    }
}
public static void ad_heap(int data[],int i,int size){
    int j,tmp,post;
    j=2*i;
    tmp=data[i];
    post=0;
    while(j<=size && post==0)
    {  
        if(j<size)
        {           

            if(data[j]<data[j+1])   //找出两个子节点最大值
                j++;
        }

        if(tmp>=data[j])            //若树根较大,结束比较过程
            post=1;
        else
        {           
            data[j/2]=data[j];      //若树根较小,则继续比较,这里将最大子节点赋值给父节点
            j=2*j;
        }
   }
   data[j/2]=tmp;                   //指定树根为父节点
   }
}

5、结果展示

原始数组:[70] [10] [50] [30] [40] [20] [60]
大顶堆内容:[70] [40] [60] [30] [10] [20] [50]

大顶堆过程:[60] [40] [50] [30] [10] [20] [70]
大顶堆过程:[50] [40] [20] [30] [10] [60] [70]
大顶堆过程:[40] [30] [20] [10] [50] [60] [70]
大顶堆过程:[30] [10] [20] [40] [50] [60] [70]
大顶堆过程:[20] [10] [30] [40] [50] [60] [70]
大顶堆过程:[10] [20] [30] [40] [50] [60] [70]

排序结果:[10] [20] [30] [40] [50] [60] [70]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京小辉

你的鼓舞将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值