堆排序
構造大頂堆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>