堆排序
组织大顶堆
第一个元素就是最大的,然后跟末了一个元素交流,把最大的弹出栈
第一个元素与它的摆布子节点比较,摆布子节点中较大的比它大则交流 然后再递归地如许交流下去直到没有比它大的子节点或许没有子节点。
云云循环往复 晓得数组长度变成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>