堆排序
构造大顶堆javascript
第一个元素就是最大的,而后跟最后一个元素交换,把最大的弹出栈
第一个元素与它的左右子节点比较,左右子节点中较大的比它大则交换 而后再递归地这样交换下去直到没有比它大的子节点或者没有子节点。html
如此循环往复 知道数组长度变成0java
<!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>