package com.rao.linkList;

import java.util.Arrays;

/**
* @author Srao
* @className HeapSort
* @date 2019/12/3 15:29
* @package com.rao.linkList
* @Description: 堆排序
*/
public class HeapSort { /**
* 在二叉堆当中,一般是删除根元素,在删除根元素之后,把最后一个元素当作根元素,然后进行下沉
* @param arr
* @param parent:被当作根元素的节点,从这个元素开始下沉
* @param length:数组的长度
* @return
*/
public static int[] downAdjust(int[] arr, int parent, int length){
//获取临时的根节点
int temp = arr[parent]; //计算左孩子节点
int child = parent*2+1; //进行下沉操作
while (child < length){
//先对比左右孩子的大小,用小的那一个进行操作
if (child+1 < length && arr[child+1] < arr[child]){
child++;
}
//如果父节点比子节点小,就直接退出
if (temp <= arr[child]){
break;
}else {//如果父节点比子节点大,就把子节点赋值给父节点
arr[parent] = arr[child];
//让父节点指针指向子节点
parent = child;
child = parent*2+1;
}
}
arr[parent] = temp;
return arr;
} /**
* 进行堆排序,因为二叉堆的顶部的数一定是最小的,
* 所以把堆顶元素和堆的最后一个元素交换,然后重新构成一个二叉堆,
* 每次都把最小的元素放在堆的最后
* @param arr
* @return
*/
public static int[] sort(int[] arr, int length){
//先构建一个二叉堆
for (int i = (length-1)/2; i>=0; i--){
downAdjust(arr, i, length);
} //进行排序
for (int i = length-1; i > 0; i--){
//先把最小的元素放在堆的最后面,然后对堆的其它元素进行下沉
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp; downAdjust(arr, 0, i);
} return arr;
} public static void main(String[] args) {
int[] arr = new int[]{1, 3, 2, 6, 5, 0};
System.out.println(Arrays.toString(arr));
sort(arr, arr.length);
System.out.println(Arrays.toString(arr));
}
}

参照上一篇博客,里面又二叉堆构建的代码  https://www.cnblogs.com/rao11/p/11976960.html

因为二叉堆的结构是堆顶元素最小,所以每次让堆顶元素和堆底元素进行交换,然后对除了最后一个元素以外的元素进行下沉操作,获得一个新的二叉堆

每次进行下沉操作,数组中最小的元素都是堆顶元素,然后又与堆底元素进行交换,直到二叉堆只剩下一个元素,排序完成。

最新文章

  1. JPA persistence
  2. SQL Server 中的逻辑读与物理读
  3. LeetCode OJ String to Integer (atoi) 字符串转数字
  4. 从零开始学ios开发(四):IOS控件(1),Image View、Text Field、Keyboard
  5. Github-Client(ANDROID)开源之旅(四) ------ 简介Roboguice
  6. 201521123066 《Java程序设计》第十二周实验总结
  7. JAVA面向对象-----main方法详解
  8. Ubuntu屏幕分辨率无1920 1080
  9. Android灯光系统_编写HAL_lights.c【转】
  10. MIT Molecular Biology 笔记1 DNA的复制,染色体组装
  11. go语言之行--数组、切片、map
  12. 使用JProfiler做性能分析过程
  13. android EditText设置光标、边框和图标,以及限制输入
  14. #测试框架推荐# test4j,数据库测试
  15. LG3960 列队
  16. Bootstrap 折叠(collapse) 初见
  17. CSS 中文字体 Unicode 编码表
  18. 浅学soap--------1
  19. memcache 基本操作
  20. 1、HTML基础总结 part-1

热门文章

  1. 单口 RAM、伪双口 RAM、真双口 RAM、单口 ROM、双口 ROM 到底有什么区别呢?
  2. (一)将mockjs集成到VUE中后,怎样根据接口入参返回mock结果
  3. JavaWeb学习路线图(2020年最新版)
  4. Tomcat 对静态资源的处理
  5. 类例程_java战斗程序
  6. wangeditor视频
  7. 解决老大难疑惑:指针 vs 引用
  8. python 读取.mat文件
  9. 第一个Golang程序
  10. 安装fastnlp