【思维】堆排序
2011-04-13 01:35 BlueDream 阅读(1164) 评论(1) 编辑 收藏 举报算法定义
堆排序(Heapsort)是指利用(堆)这种数据结构所设计的一种排序算法。堆积树是一个近似完全二叉树的结构,并同时满足堆属性:即子结点的键值或索引总是小于(或者大于)它的父节点。
最差时间复杂度 | O(nlogn) |
---|---|
最优时间复杂度 | O(nlogn) |
平均时间复杂度 | Θ(nlogn) |
算法描述
在堆积树的数据结构中,堆积树中的最大值总是位于根节点。堆积树中定义以下几种操作:
- 最大堆积调整(Max_Heapify):将堆积树的末端子结点作调整,使得子结点永远小于父结点
- 创建最大堆积(Build_Max_Heap):将堆积树所有数据重新排序
- 堆积排序(HeapSort):移除位在第一个数据的根结点,并做最大堆积调整的递归运算
源码描述
var HEAP_SIZE = 10;
// 获取父节点
function getParent(i) {
return Math.floor(i/2);
}
// 获取左子节点
function getLeft(i) {
return 2 * i;
}
// 获取右子节点
function getRight(i) {
return (2 * i + 1);
}
// 对单一子节点维持最大堆
function Max_Heapify(A, i, heap_size) {
var l = getLeft(i);
var r = getRight(i);
var largest;
var temp;
if (l < heap_size && A[l] > A[i]) {
largest = l;
} else {
largest = i;
}
if (r < heap_size && A[r] > A[largest]) {
largest = r;
}
if (largest != i) {
temp = A[i];
A[i] = A[largest];
A[largest] = temp;
Max_Heapify(A, largest, heap_size);
}
}
// 建立最大堆树结构
function Buile_Max_Heap(A) {
for (var i = Math.floor(HEAP_SIZE/2); i >= 0; i--) {
Max_Heapify(A, i, HEAP_SIZE);
}
}
// 打印最大堆二叉树
function printTree(A) {
for (var i = 0; i < HEAP_SIZE; i++) {
document.write(A[i] + '<br/>');
}
}
// 堆排序
function HeapSort(A, heap_size) {
var temp;
Buile_Max_Heap(A);
for (var i = heap_size-1; i >= 1; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
heap_size = heap_size - 1;
Max_Heapify(A, 0, heap_size);
}
printTree(A);
}
// 测试堆排序
(function() {
var A = [4,1,3,2,16,9,10,14,8,7];
HeapSort(A, HEAP_SIZE);
})();
function getParent(i) {
return Math.floor(i/2);
}
// 获取左子节点
function getLeft(i) {
return 2 * i;
}
// 获取右子节点
function getRight(i) {
return (2 * i + 1);
}
// 对单一子节点维持最大堆
function Max_Heapify(A, i, heap_size) {
var l = getLeft(i);
var r = getRight(i);
var largest;
var temp;
if (l < heap_size && A[l] > A[i]) {
largest = l;
} else {
largest = i;
}
if (r < heap_size && A[r] > A[largest]) {
largest = r;
}
if (largest != i) {
temp = A[i];
A[i] = A[largest];
A[largest] = temp;
Max_Heapify(A, largest, heap_size);
}
}
// 建立最大堆树结构
function Buile_Max_Heap(A) {
for (var i = Math.floor(HEAP_SIZE/2); i >= 0; i--) {
Max_Heapify(A, i, HEAP_SIZE);
}
}
// 打印最大堆二叉树
function printTree(A) {
for (var i = 0; i < HEAP_SIZE; i++) {
document.write(A[i] + '<br/>');
}
}
// 堆排序
function HeapSort(A, heap_size) {
var temp;
Buile_Max_Heap(A);
for (var i = heap_size-1; i >= 1; i--) {
temp = A[0];
A[0] = A[i];
A[i] = temp;
heap_size = heap_size - 1;
Max_Heapify(A, 0, heap_size);
}
printTree(A);
}
// 测试堆排序
(function() {
var A = [4,1,3,2,16,9,10,14,8,7];
HeapSort(A, HEAP_SIZE);
})();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
2010-04-13 IE下检测泄露的全局变量
2010-04-13 JS初步继承机制.