详解如何在Java中实现堆排序算法
作者:之一Yo 发布时间:2023-11-11 11:34:46
标签:Java,堆排序
算法描述
堆排序算法的描述如下:
将待排序的数组调整为最大堆,此时未排序的长度
N
为数组的长度,调整的过程就是倒序将数组的前N/2
个元素下沉的过程,每次下沉都会将较大的元素带到上面,最终将数组变为最大堆;弹出最大堆的堆顶元素并将其移动到数组的最后面,将原本最后面的元素放到堆顶,然后将未排序的长度
N
- 1,调整数组的前N
个元素为最大堆;重复步骤 2 直到未排序的长度为 0.
实现代码
package com.zhiyiyo.collection.sort;
import java.util.Arrays;
public class HeapSort extends BaseSort {
@Override
public void sort(Comparable[] array) {
int N = array.length;
// 创建最大堆
for (int i = N / 2; i >= 0; i--) {
sink(array, i, N);
}
// 就地排序
while (N > 0) {
// 将最大的元素移动到数组的尾部,同时将未排序的长度-1
swap(array, 0, --N);
// 调整最大堆
sink(array, 0, N);
}
}
/**
* 下沉元素
*
* @param array 数组
* @param k 下沉的元素索引
*/
private void sink(Comparable[] array, int k, int N) {
while (2 * k + 1 < N) {
int j = 2 * k + 1;
if (j < N - 1 && less(array[j], array[j + 1])) j++;
if (!less(array[k], array[j])) break;
swap(array, k, j);
k = j;
}
}
}
抽象类 BaseSort
的代码为:
package com.zhiyiyo.collection.sort;
/**
* 数组排序抽象类
*/
public abstract class BaseSort {
public abstract void sort(Comparable[] array);
/**
* 交换数组元素
*
* @param array 数组
* @param a 数组下标 a
* @param b 数组下标 b
*/
protected static void swap(Comparable[] array, int a, int b) {
Comparable tmp = array[a];
array[a] = array[b];
array[b] = tmp;
}
protected static boolean less(Comparable a, Comparable b) {
return a.compareTo(b) < 0;
}
}
测试代码
package com.zhiyiyo.collection.sort;
import org.junit.Test;
import java.util.Arrays;
public class HeapSortTest {
@Test
public void sort() {
Integer[] array = {5, 10, 9, 6, 8, 7, 2, 1, 4, 3};
new HeapSort().sort(array);
System.out.println(Arrays.toString(array));
}
}
最终排序结果为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],以上~
来源:https://www.cnblogs.com/zhiyiYo/p/16042137.html
0
投稿
猜你喜欢
- jmap命令可以打印java进程的JVM堆信息,今天在某台机器上运行该命令查看 19560进程的堆信息jmap -heap 19560出现以
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.循环队列循环队列 (Circular Queue) 是一
- File类概述File类能新建、删除、重命名文件和目录,但不能访问文件内容本身,如果需要访问文件内容本身,则需要使用后续的输入/输出流。要在
- 导语在使用flutter 自带图片组件的过程中,大家有没有考虑过flutter是如何加载一张网络图片的? 以及对自带的图片组件我们可以做些什
- 前言CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流
- 我们都知道,当RecyclerView数据源更新后,还需要通过adapter调用对应的方法,从而让RecyclerView重新绘制页面本次也
- 本文实例为大家分享了Android微信摇一摇功能的实现方法,供大家参考,具体内容如下import java.util.ArrayList;
- OutputDebugString属于windows API的,所以只要是包含了window.h这个头文件后就可以使用了。可以把调
- 简单几步,实现SpringMVC+servlet3.0文件上传功能:第一步:配置web.xml文件中的servlet,添加multipart
- Android 显示GIF图片实例详解gif图动画在Android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以
- 1)打开idea,开始创建SpringBoot项目2)选择 Spring Initializr ,选择合适的jdk版本,点击Next在操作到
- 简介官方API文档Scaffold的of方法说明有说明调用Scaffold.of方法是在Scallfold的子组件的Build方法中,也就是
- 这篇文章主要介绍了Java如何实现自定义异常类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 就网络和应用程序而言,键盘快捷键很重要,今天我们要谈的便是让这类快捷键得以在Flutter运作的小部件:Focus、Shortcuts和Ac
- 代码背景一个班级,有两类学生,A类:不学习,玩,但是玩的东西不一样,有的是做游戏,有的是看电视B类:放哨的学生,专门看老师的动向,如果老师进
- 一 :问题背景问题:当查询接口较复杂时候,数据的获取都需要[远程调用],必然需要花费更多的时间。 假如查询文章详情页面,需要如下标注的时间才
- 服务降级服务压力剧增的时候,根据当前的业务情况及流量对一些服务和页面有策略的降级,以此缓解服务器的压力,以保证核心任务的进行。同时保证部分甚
- Android四种数据存储的应用方式作为一个完整的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分
- 本文实例为大家分享了opencv实现轮廓高斯滤波平滑的具体代码,供大家参考,具体内容如下一个小测试的题目:在图像上点选,找到与点选处相邻的颜
- Jackson解析嵌套类(MismatchedInputException)具体报错如下问题描述:Jackson解析嵌套类问题 调