最近工作不忙,重温一下大学的算法学习,记录巩固一下。下面介绍一下堆排序。
堆排序原理?
堆排序(heap Sort)指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
要理解堆排序,需要先理解二叉树:
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree),而二叉树还有个名字叫做二叉堆(看起来一堆。。。)。
二叉堆是一棵被完全填满的二叉树,有例外的可能是底层元素,底层元素从左到右填入,这样的树被称为完全二叉树。
堆排序主要分三步:
(1)构建堆
(2)调整堆
(3)堆排序
实现
function heapSort(_arr){
function heapAdjust(arr, i, length) {
let temp = arr[i];//先取出当前元素的值,保存在临时变量
for (let k = i * 2 + 1; k < length; k = k * 2 + 1) {
if (k + 1 < length && arr[k] < arr[k + 1]) {
k++;
}
if (arr[k] > temp) {
arr[i] = arr[k];
i = k;
} else {
break;
}
arr[i] = temp;
}
}
let temp;
for (let i = Math.floor(_arr.length / 2) - 1; i >= 0; i--) {
heapAdjust(_arr, i, _arr.length)
}
for (let j = _arr.length - 1; j > 0; j--) {
//交换
temp = _arr[j];
_arr[j] = _arr[0];
_arr[0] = temp;
heapAdjust(_arr, 0, j);
}
return _arr;
}