堆排序
构造大顶堆
第一个元素就是最大的,然后跟最后一个元素交换,把最大的弹出栈
第一个元素与它的左右子节点比较,左右子节点中较大的比它大则交换 然后再递归地这样交换下去直到没有比它大的子节点或者没有子节点。
如此循环往复 知道数组长度变成0
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<script type="text/javascript">
var content = "<%=content%>";
document.write(content);
</script>
<script type="text/javascript">
// var arr = [4];
var arr = [4, 72, 2, 3, 9, 7, 5, 6, 12, 63, 10];
var tempArr = [];
function heapSortArr(arr) {
//大顶堆
function make_tree(arr) {
for(var i = 0; i < arr.length; i++) {
var v = arr[i],
len = tempArr.length;
tempArr[len] = v;
while(tempArr[len] > tempArr[parseInt(len / 2)]) {
swapArrValue(len, parseInt(len / 2));
len = parseInt(len / 2);
}
}
}
function swapArrValue(a, b) {
tempArr[a] = tempArr[a] ^ tempArr[b];
tempArr[b] = tempArr[b] ^ tempArr[a];
tempArr[a] = tempArr[a] ^ tempArr[b];
return true;
}
var sortArr = [];
function sort_tree(n) {
swapArrValue(0, n);
sortArr.push(tempArr.pop());
if(n) {
exchange_tree(0);
sort_tree(n - 1);
}
}
function exchange_tree(i) {
var len = tempArr.length;
if(i * 2 + 2 < len - 1) { //有左右子节点
if(tempArr[i * 2 + 1] > tempArr[i * 2 + 2]) {
tempArr[i] < tempArr[i * 2 + 1] && swapArrValue(i, i * 2 + 1) && exchange_tree(i * 2 + 1);
} else {
tempArr[i] < tempArr[i * 2 + 2] && swapArrValue(i, i * 2 + 2) && exchange_tree(i * 2 + 2);
}
} else if(i * 2 + 1 < len - 1) { //只有左节点
tempArr[i] < tempArr[i * 2 + 1] && swapArrValue(i, i * 2 + 1) && exchange_tree(i * 2 + 1);
}
}
make_tree(arr);
sort_tree(tempArr.length - 1);
return sortArr;
}
console.log(arr);
arr = heapSortArr(arr);
console.log(arr);
</script>
</body>
</html>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。