Java实现堆排序(Heapsort)实例代码

时间:2023-06-15 02:02:11 


import java.util.Arrays;


public class HeapSort {

    public static void heapSort(DataWraper[] data){
        System.out.println("开始排序");
        int arrayLength=data.length;
        //循环建堆
        for(int i=0;i<arrayLength-1;i++){
            //建堆
            buildMaxHeap(data,arrayLength-1-i);
            //交换堆顶和最后一个元素
            swap(data,0,arrayLength-1-i);
            System.out.println(Arrays.toString(data));
        }
    }

    private static void swap(DataWraper[] data, int i, int j) {
        // TODO Auto-generated method stub
        DataWraper tmp=data[i];
        data[i]=data[j];
        data[j]=tmp;
    }
    //对data数组从0到lastIndex建大顶堆
    private static void buildMaxHeap(DataWraper[] data, int lastIndex) {
        // TODO Auto-generated method stub
        //从lastIndex处节点(最后一个节点)的父节点开始
        for(int i=(lastIndex-1)/2;i>=0;i--){
            //k保存正在判断的节点
            int k=i;
            //如果当前k节点的子节点存在
            while(k*2+1<=lastIndex){
                //k节点的左子节点的索引
                int biggerIndex=2*k+1;
                //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在
                if(biggerIndex<lastIndex){
                    //若果右子节点的值较大
                    if(data[biggerIndex].compareTo(data[biggerIndex+1])<0){
                        //biggerIndex总是记录较大子节点的索引
                        biggerIndex++;
                    }
                }
                //如果k节点的值小于其较大的子节点的值
                if(data[k].compareTo(data[biggerIndex])<0){
                    //交换他们
                    swap(data,k,biggerIndex);
                    //将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值
                    k=biggerIndex;
                }else{
                    break;
                }
            }
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        DataWraper [] data={
                new DataWraper(21, ""),
                new DataWraper(30, ""),
                new DataWraper(49, ""),
                new DataWraper(30, "*"),
                new DataWraper(16, ""),
                new DataWraper(9, ""),

        };
        System.out.println("排序之前:\n"+Arrays.toString(data));
        heapSort(data);
        System.out.println("排序之后:\n"+Arrays.toString(data));
    }

}

结果:

排序之前:
[21, 30, 49, 30*, 16, 9]
开始排序
[9, 30, 21, 30*, 16, 49]
[16, 30*, 21, 9, 30, 49]
[9, 16, 21, 30*, 30, 49]
[9, 16, 21, 30*, 30, 49]
[9, 16, 21, 30*, 30, 49]
排序之后:
[9, 16, 21, 30*, 30, 49]

标签:Java,堆排序,Heapsort
0
投稿

猜你喜欢

  • 在web.config和app.config文件中增加自定义配置节点的方法

    2021-11-03 03:21:41
  • 史上最全的java随机数生成算法分享

    2023-10-17 15:22:33
  • unity 如何获取button文本的内容

    2022-01-29 19:31:04
  • C# 抽象类,抽象属性,抽象方法(实例讲解)

    2022-03-14 09:22:16
  • Java多线程和并发基础面试题(问答形式)

    2022-03-29 17:39:42
  • Java新手环境搭建 JDK8安装配置教程

    2023-11-25 17:23:10
  • Java设计模式之单例和原型

    2023-11-29 04:14:18
  • c#定时运行程序分享(定时程序)

    2023-12-11 20:47:31
  • @SpringBootApplication注解的使用

    2022-09-13 04:53:32
  • Java回调函数原理实例与代理模式的区别讲解

    2023-04-16 21:21:01
  • c#使用windows服务更新站点地图的详细示例

    2021-07-24 10:45:52
  • C#操作注册表之RegistryKey类

    2022-12-11 06:12:53
  • 详解Android内存优化策略

    2022-01-03 13:52:10
  • 一口气说出Java 6种延时队列的实现方法(面试官也得服)

    2022-12-15 16:40:12
  • Java单例模式实现的几种方式

    2021-06-09 18:38:47
  • Maven 生成打包可执行jar包的方法步骤

    2023-01-02 14:53:15
  • C++中string字符串分割函数split()的4种实现方法

    2023-02-05 23:28:48
  • SuperSocket入门--Telnet服务器和客户端请求处理

    2021-07-24 19:35:14
  • springboot实现多模块项目添加一新模块

    2021-09-22 16:43:09
  • 通过IDEA快速定位和排除依赖冲突问题

    2021-06-07 02:01:16
  • asp之家 软件编程 m.aspxhome.com