大顶堆积排序--Java版

480人阅读 评论(2) 收藏 举报
分类:

目录

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人简介
    个人资料
    • 访问:360522次
    • 积分:6497
    • 等级:
    • 排名:第3931名
    • 原创:283篇
    • 转载:23篇
    • 译文:24篇
    • 评论:76条
    博客专栏
    【友情推荐】章鱼大数据