資料結構之二叉堆 構建堆,堆排序

2021-08-04 10:09:17 字數 1812 閱讀 4182

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.正常的情況下,陣列可以通...