>[success] # 使用堆进行排序
~~~
1.堆两种形式,一种是最大堆,一种是最小堆,我们可以利用这个特性对数组进行快速排序
,这样排序的时间复杂度'O(nlogn)'
2.用堆进行排序当然需要两步,第一步是吧数组中杂乱无章的数据先变成'堆',这个过程时间复杂度
为'O(n)',当整个'堆'建立完成后,需要对其排序,树排序是根据树的高度,堆的好处就是因为定义概念
将整体高度和数组长度相比是更短所用的时间也是更少的'O(nlogn)',因此这个建堆和排序过程我们可以
看做成'O(nlogn)'
3.用最大堆得到一个升序排列的数组(从最小到最大)。要这个数组按降序排列,可以用最小堆代替。
~~~
>[info] ## 代码实现
~~~
const Compare = {
LESS_THAN: -1,
BIGGER_THAN: 1,
EQUALS: 0
};
function defaultCompare(a, b) {
if (a === b) {
return Compare.EQUALS;
}
return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
}
function reverseCompare(compareFn) {
return (a, b) => compareFn(b, a);
}
function swap(array, a, b) {
/* const temp = array[a];
array[a] = array[b];
array[b] = temp; */
[array[a], array[b]] = [array[b], array[a]];
}
// 将数组变成堆结构,这是一个创建堆的过程
function heapify(array, index, heapSize, compareFn) {
let largest = index;
const left = (2 * index) + 1;
const right = (2 * index) + 2;
if (left < heapSize && compareFn(array[left], array[index]) > 0) {
largest = left;
}
if (right < heapSize && compareFn(array[right], array[largest]) > 0) {
largest = right;
}
if (largest !== index) {
swap(array, index, largest);
heapify(array, largest, heapSize, compareFn);
}
}
// 创建调用的方法
function buildMaxHeap(array, compareFn) {
for (let i = Math.floor(array.length / 2); i >= 0; i -= 1) {
heapify(array, i, array.length, compareFn);
}
return array;
}
// 将堆进行排序
function heapSort(array, compareFn = defaultCompare) {
let heapSize = array.length;
// 用数组创建一个最大堆用作源数据。
buildMaxHeap(array, compareFn);
while (heapSize > 1) {
// 在创建最大堆后,最大的值会被存储在堆的第一个位置。我们要将它替换为堆的最后一个
// 值,将堆的大小减 1。
swap(array, 0, --heapSize);
// 们将堆的根节点下移并重复步骤 2 直到堆的大小为 1
heapify(array, 0, heapSize, compareFn);
}
return array;
}
~~~
- 接触数据结构和算法
- 数据结构与算法 -- 大O复杂度表示法
- 数据结构与算法 -- 时间复杂度分析
- 最好、最坏、平均、均摊时间复杂度
- 基础数据结构和算法
- 线性表和非线性表
- 结构 -- 数组
- JS -- 数组
- 结构 -- 栈
- JS -- 栈
- JS -- 栈有效圆括号
- JS -- 汉诺塔
- 结构 -- 队列
- JS -- 队列
- JS -- 双端队列
- JS -- 循环队列
- 结构 -- 链表
- JS -- 链表
- JS -- 双向链表
- JS -- 循环链表
- JS -- 有序链表
- 结构 -- JS 字典
- 结构 -- 散列表
- 结构 -- js 散列表
- 结构 -- js分离链表
- 结构 -- js开放寻址法
- 结构 -- 递归
- 结构 -- js递归经典问题
- 结构 -- 树
- 结构 -- js 二搜索树
- 结构 -- 红黑树
- 结构 -- 堆
- 结构 -- js 堆
- 结构 -- js 堆排序
- 结构 -- 排序
- js -- 冒泡排序
- js -- 选择排序
- js -- 插入排序
- js -- 归并排序
- js -- 快速排序
- js -- 计数排序
- js -- 桶排序
- js -- 基数排序
- 结构 -- 算法
- 搜索算法
- 二分搜索
- 内插搜索
- 随机算法
- 简单
- 第一题 两数之和
- 第七题 反转整数
- 第九题 回文数
- 第十三题 罗马数字转整数
- 常见一些需求
- 把原始 list 转换成树形结构