堆排序 大根堆,小根堆:所有非叶子节点大于或者小于其孩子节点。 用大根堆进行从小到大的排序 建立大根堆:从下往上,从右往左遍历非叶子节点,判断其是否符合大根堆性质,若不符合,则交换节点位置,直至建出大根堆。 大根堆根节点一定是被排序的这段数值的最大值,交换堆尾堆首数值,堆尾指针前移(有没有冒泡的感觉 ...
分类:
编程语言 时间:
2020-05-16 12:18:49
阅读次数:
77
0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时 ...
分类:
编程语言 时间:
2020-05-15 11:20:46
阅读次数:
75
问题描述: 通过堆排序,从小到大排序一个数组。 算法实现: public static void heapSort(int[] arr) { int N = arr.length - 1; for(int i = arr.length / 2 - 1; i >= 0; i--) { sink(arr ...
分类:
编程语言 时间:
2020-03-31 12:47:06
阅读次数:
67
堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值总是小于(或者大于)它的父节点,前者称为大顶堆,后者成为小顶堆 解析(大顶堆) 大顶堆即父结点的值总是大于孩子结点 图示(以树为魂,以数组为形) 逻辑表示( ...
分类:
编程语言 时间:
2020-03-21 20:58:40
阅读次数:
82
1.堆排序 堆是一个完全二叉树。 完全二叉树: 二叉树除开最后一层,其他层结点数都达到最大,最后一层的所有结点都集中在左边(左边结点排列满的情况下,右边才能缺失结点)。 大顶堆:根结点为最大值,每个结点的值大于或等于其孩子结点的值。 小顶堆:根结点为最小值,每个结点的值小于或等于其孩子结点的值。 对 ...
分类:
编程语言 时间:
2020-03-10 11:51:47
阅读次数:
80
一、并查集的定义 1. 并查集是一种维护集合的数据结构,它的名字中“并”、“查”、“集”。分别取自Union(合并)、Find(查找)、Set(集合)。 合并:就是合并两个集合 查找:判断两个元素是否在一个集合 那么并查集是用什么实现的,就是一个数组, 对于同一个集合来说只存在一个根结点,且将其作为 ...
分类:
其他好文 时间:
2020-02-23 00:08:03
阅读次数:
94
Heaps and Heapsort: 堆是一种快速访问最大优先级元素的数据结构,这是快速实现选择排序的基础,但是总体来说平均速度比快排要慢一点,不过其最坏情况和平均情况是差不多的。 首先是堆的定义,每个结点比它的孩子结点都小(所以父节点最小),或者每个结点都比它的孩子结点大(父节点最大),把A[1 ...
分类:
其他好文 时间:
2020-02-03 12:07:47
阅读次数:
112
堆的详细创建过程:参考:https://www.jianshu.com/p/21bef3fc3030 明白堆的详细创建过程的前提是要理解Shift Down。 但是这明显不符合最大堆的定义,所以我们需要让该完全二叉树转换成最大堆!怎么转换成一个最大堆呢? 最大堆有一个特点就是其各个子树都是一个最大堆 ...
分类:
其他好文 时间:
2020-02-02 19:38:51
阅读次数:
61
importjava.util.Arrays;publicclassTest{privatestaticvoidswap(int[]arr,inta,intb){inttmp=arr[a];arr[a]=arr[b];arr[b]=tmp;}privatestaticintparent(inti){return(i-1)>>1;}privatestaticintleft(inti){r
分类:
编程语言 时间:
2020-01-15 09:21:14
阅读次数:
88
1、简述synchroized和java.util.concurrent.locks.Lock的异同? 1.synchronized 用在方法和代码块的区别? a. 可以只对需要同步的使用 b.与wait(),notify()和notifyall()方法使用比较方便 2.wait() a。释放持有的 ...
分类:
其他好文 时间:
2019-12-28 14:38:49
阅读次数:
89