当前位置: 首页 > news >正文

【算法基础(四)】堆排序(二)

堆排序(二)

把数组从零开始连续的一段 = 完全二叉树 size

i 左 son 2*1+1

i 右 son 2*1+2

父 (i-1) / 2

堆是完全二叉树,分为大根堆和小根堆

在完全二叉树里,每一棵子数最大的值是头节点的值,就是大根堆

同理,在完全二叉树里,每一棵子数最小的值是头节点的值,就是小根堆

大根堆排序,插入的值 和 父节点比较,如果比父节点大,和它交换,直到最大,就停止,通过这样的调整,得到的一定是大根堆。这个过程,我们叫做 heapInsert

public static void heapInsert(int [] arr, int index) {while (arr[index] > arr[(index - 1) / 2]) {// 和父节点交换值  并且把当前下标移动到父节点swap(arr, index, (index - 1) / 2); index = (index - 1) / 2; }
}

从一堆数中找出最大值,移除它,保持还是大根堆,我们管这个过程叫做heapify

public static void heapify(int [] arr, int index, int heapSize) {int left = index * 2 + 1; // 左孩子的下标while (left < heapSize) { // 下方还有孩子 (左孩子越界,那么就没有右孩子了。)// 俩个孩子中,谁的值大,把下标给谁 (先找出孩子中最大的)int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1:left;// 父和孩子之间,谁的值大,把下标给谁 (较大的孩子和父节点找出最大的)largest = arr[largest] > arr[index] ? largest : index;if (largest == index) { // 如果当前节点就是最大的 跳出break;}swap(arr, largest, index); // 交换位置index = largest; // 继续比较left = index * 2 + 1; // 找左孩子继续 while}
}

题目:

已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过K,并且K相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。

假如K = 6 ,建立一个heapSize = 7 的小根堆 (这样小根堆的最小值一定是数组的最小值)

把最小的弹出,保持小根堆,新加入的数字做heapfiy,

继续上面的步骤,直到全部弹出。

public static void main(String[] args) {PriorityQueue<Integer> heap = new PriorityQueue<>();heap.add(8);heap.add(4);heap.add(10);heap.add(3);while(!heap.isEmpty) {System.out.println(heap.poll());}
}
http://www.lryc.cn/news/39340.html

相关文章:

  • C++类型转换
  • Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台(2023-03-11)
  • 蓝桥杯刷题第九天
  • a-tree-select 基本使用,下拉框高度和宽度设置、回显时滚动条定位解决。
  • 【Linux】之nc命令(连接与扫描指定端口、监测服务端口的使用情况)解析、详解实例、邮件告警
  • cdn简单配置
  • 前端安全(自留)
  • 零基础转行云计算可行吗
  • 【AcWing】蓝桥杯备赛-深度优先搜索-dfs(1)
  • 孩子免费就读|私企经理自费赴美国东海岸高校访学
  • 前端面试hr经常会问的问题
  • C动态数组
  • 【STL一】STL组件(容器、迭代器、算法)
  • Java每日一练(20230312)
  • Linux中sudo,su与su -命令的区别
  • 归并排序有多简单?一幅图教你看懂【C语言】
  • C++-Z字扫描实现(Zigzag Scan)
  • 【华为机试真题详解 Python实现】求最大数字【2023 Q1 | 100分】
  • 面对数万亿产业规模,如何掘金工业互联网?
  • #ifdefine #define #endif (避免头文件被重复包含的真正含义)
  • 单片机能运行操作系统吗?
  • Python之webmagic爬虫优点与使用
  • 代码随想录动态规划 || 121 122
  • C++STL库中不可或缺的部分—string(模拟实现)
  • MySQL复合查询
  • PCIe 资料收集2
  • Linux网络编程(使用VScode远程登录ubuntu)
  • 如何提高项目估算精准度?关键看5大影响因子
  • 论文阅读笔记《Nctr: Neighborhood Consensus Transformer for Feature Matching》
  • 上位机系统Ubuntu 20.04与下位机arduino UNO通讯