public
class
heap
; system.out.println("原始:"
);
printheapbylevel(array);
system.out.println("最小堆:"
);
getminheap(array);
printheapbylevel(array);
sort(array);
printheapbylevel(array);
} /*
* 堆的性質(最小堆為例):
* 0.根節點為最小值
* 1.堆可以看做是乙個完全二叉樹(即孩子節點從左向右排列)
* 2.堆的高度lgn/lg2(n為節點的數目)
* 3.第i節點的左孩子節點是2*i+1,右孩子節點為2*i+2
* 4.以任意乙個節點作為根節點,那麼該節點都是堆
* 5.可以用乙個資料來表示堆
*//*
* 構建堆的原理:
* 上濾
* 在最後乙個節點後建立乙個空節點,新插入的節點和父節點比較:
* 1,比父節點大,那麼直接插入在這個空堆處
* 2,比父節點小,那麼該父節點下移至該空節點
* 3,重複1,2直至插入堆中
*/public
static
void
getminheap(
intarray)
//從插入第k個位置的值到堆中,插入乙個的最壞情況就是lgn
public
static
void
insert(
intarrary,
intk)
else
//需要插入的元素大於該父節點,該節點正好可以插在最後乙個位置
} } //按層次列印乙個堆
public
static
void
printheapbylevel(
intarray)
else
system.out.print(array[i]+" "
);
} system.out.println();
} /*
* 二叉樹的排序
*/public
static
void
sort(
intarray)
} /** 刪除乙個根節點,也就是最小值
* 那麼子節點要上浮
* 可以根據此用堆排序
* 將刪除的最小值放在陣列的最後乙個位置,節省空間
* 根節點為i(0,1,2,3...)
* 左孩子節點為:2*i+1
* 右孩子節點為:2*i+2
* n是剩下的節點
*/public
static
void
deletemin(
intarray,
intn)
else
} //此刻temp為要空,要將最後乙個節點值放在temp這個位置上,並且移動temp
array[temp]=array[n];
array[n]=min;
if(temp//要調整的節點後面還有節點
資料結構之二叉堆 堆排序
很久以前排序演算法的時間複雜度一直是o n 2 當時學術界充斥著 排序演算法不可能突破o n 2 的聲音,直到1959年,由d.l.shell提出了一種排序演算法,希爾排序 shell sort 才打破了這種不可能的聲音,把排序演算法的時間複雜度提公升到了o n 3 2 當科學家們知道這種 不可能 ...
資料結構之二叉堆 堆排序
很久以前排序演算法的時間複雜度一直是o n 2 當時學術界充斥著 排序演算法不可能突破o n 2 的聲音,直到1959年,由d.l.shell提出了一種排序演算法,希爾排序 shell sort 才打破了這種不可能的聲音,把排序演算法的時間複雜度提公升到了o n 3 2 當科學家們知道這種 不可能 ...
JS資料結構 二叉堆 堆排序
結構特性 這是一種特殊的二叉樹,他是乙個完全的二叉樹,樹的每一層都有左右子樹,並且最後一層的葉節點盡可能都是左子樹 堆特性 二叉堆不是最小堆就是最大堆。最小堆允許快速找到樹的最小值,最大堆允許找到樹的最大值。所有節點都大於等於 最大堆 或者小於等於 最小堆 每個他的子樹 1.正常的情況下,陣列可以通...