// 二叉堆
// 父親節點大於等於 子節點
// 是一顆完全二叉樹
function swap(arr, x, y)
class maxheap
} else
}// 返回 資料的大小
size()
// 判斷item是否是 空的
isempty()
// 新增新元素
insert (item)
shiftup(count)
}// 出堆
extractmax()
return null;
}shiftdown(k)
// 如果父節點 大於子節點最大值 則跳出迴圈
if( this.item[k] > this.item[j])
swap(this.item, k, j);
k=j;}}
// 堆排序演算法
// 將n個元素逐個插入到乙個空堆中,演算法複雜度是o(nlongn)
function heapsort(arr, n)
// 而 heapify 的過程, 演算法複雜度是o(n)
// 就是建構函式中有兩個引數的例子
function heapsort2(arr, n)
// 原地堆 排序
function __shiftdown(arr, n, i)
// 如果父節點 大於子節點最大值 則跳出迴圈
if( arr[i] > arr[j])
swap(arr, i, j);
i=j;}}
function heapsort3(arr, n)
return arr;
}//生成乙個陣列
function generate(n, rangel, rangr){
var arr =
for(var i=0; i
// 隨機的 100000個陣列 排序的耗時
var n = 100000;
var arr = generate(n, 0, n)
var arr2 = .concat(arr);
var arr3 = .concat(arr);
var start = new date();
heapsort(arr, n)
var end = new date();
console.log("heapsort用時:" + (end - start) + "毫秒")
var start2 = new date();
heapsort2(arr2, n)
var end2 = new date();
console.log("heapsort2用時:" + (end2 - start2) + "毫秒")
var start3 = new date();
heapsort3(arr3, n)
var end3 = new date();
console.log("heapsort3用時:" + (end3 - start3) + "毫秒")
//穩定排序 對於相等的元素 在排序後,原來靠前的元素依然靠前
資料結構和演算法之排序四 氣泡排序
我們在學習排序演算法的時候或許很多人接觸到的都是冒泡和選擇這兩種排序演算法,其實真的可以說的是這兩種演算法確實是比較經典的排序方法,同時,在我的理解中,這兩個排序具有驚奇的相似點。何為氣泡排序,如果我們在家煮過水都能知道,在水即將沸騰的時候會有乙個又乙個的水泡往上冒,這個現象其實和氣泡排序還是比較相...
資料結構和演算法之排序四 氣泡排序
我們在學習排序演算法的時候或許很多人接觸到的都是冒泡和選擇這兩種排序演算法,其實真的可以說的是這兩種演算法確實是比較經典的排序方法,同時,在我的理解中,這兩個排序具有驚奇的相似點。何為氣泡排序,如果我們在家煮過水都能知道,在水即將沸騰的時候會有乙個又乙個的水泡往上冒,這個現象其實和氣泡排序還是比較相...
資料結構與演算法之排序演算法(四) 歸併排序
歸併排序 分治思想的運用 原理 將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的,然後再把有序的子串行合併為整天有序序列。分治演算法步驟 第一步 劃分。將原問題劃分為幾個子問題 第二步 遞迴求解。遞迴求解每個子問題 第三步 合併。將求解後的子問題合併...