堆是乙個完全二叉樹,每個節點的值都大於或等於左右節點的值的堆叫大頂堆,小於左右節點的值的堆叫小頂堆
思路:先將原數列構造成乙個大頂堆或小頂堆(是數列下標對應的順序儲存二叉樹)
,然後將根節點與數列最後的節
點進行交換,再將剩餘的數列構成乙個堆,迴圈直到得到乙個有序序列,一般公升序用大頂堆,降序用小頂堆
構建大頂堆思路:從最後乙個非葉子節點對應子樹開始與其左右節點進行比較交換,依次向上比較,直到全部交換完
畢即可得到乙個大頂堆
**實現(公升序)
//堆排序
public
class
heapselect
int temp;
//中間交換數
//將原陣列構建成乙個大頂堆
for(
int i = arr.length /2-
1; i >=
0; i--
)//將大頂堆的頂與陣列最後的數進行交換
for(
int i = arr.length -
1; i >
0; i--
) system.out.
println
(arrays.
tostring
(arr));
}// length 需要排序的陣列的長度 i為需要構成大頂堆的陣列下標
public
static
void
select
(int
arr,
int length,
int i)
//如果子節點大於根節點,交換兩數
if(temp < arr[j]
)else
arr[i]
= temp;}}
}八千萬條資料測試平均時間1s左右
給定n個權值作為n個葉子節,構成一顆二叉樹,若該樹的帶權路徑長度最小,稱這樣的樹為最優二叉樹(哈夫曼樹)
帶權路徑長度:節點的權值與路徑長度的乘積
樹的帶權路徑:所有葉子節點的帶權路徑長度的和
哈夫曼樹構建思路:將需要構建哈夫曼樹的對應數列公升序排列,取出前兩個樹,將其作為左右節點,她們的權值的和
構成父節點,形成一顆二叉樹,將新二叉樹的父節點加入數列,同時刪除原來的兩個數,繼續迴圈此操作,直到所有的
數全部排完即可獲得一顆哈夫曼樹
**實現
**節點類
//哈夫曼樹節點
public
class
huffmantreenode
implements
comparable
@override
public
intcompareto
(huffmantreenode o)
public
void
pre()if
(this
.right != null)}}
**哈夫曼樹類
//哈夫曼樹
public
class
huffmantree
;createhuffmantree
(arr)
.pre()
;}//建立哈夫曼樹
public
static huffmantreenode createhuffmantree
(int
arr)
while
(list.
size()
>1)
return list.
get(0)
;}}哈夫曼編碼:將需要編碼的檔案以每個位元組出現的次數作為權值,位元組的值作為節點儲存的資料值,構成一顆哈夫曼
樹,同時規定向左和向右分別為0和1
,得到每個葉子節點對應得路徑對應的01字串,以此字串**此位元組的編碼
方式,以此編碼方式來壓縮檔案,進行傳輸,對方再以該編碼方式進行解碼即可
資料結構演算法爬坑日記一
線性結構 最常用的資料結構,特點是資料元素之間存在一對一的線性關係 分倆種儲存結構 1.順序儲存結構 又稱為順序表,儲存元素是連續的 2.鏈式儲存結構 又稱為鍊錶,儲存元素不一定是連續的,元素節點中存放資料元素以及相鄰元素的位址結構 常見線性資料結構 陣列 佇列 鍊錶 棧 非線性結構 常見二維陣列 ...
資料結構演算法爬坑日記六
回溯法 也叫向前試探法,試著尋找正確的求解,當探索到某一步不符合規則時,便回退到上一步進行重新選擇,直到獲取預期的解法 問題描述 在8 8的西洋棋棋盤上,放置八個皇后且八個皇后不能互相攻擊 思路 先將第乙個放在第一行第一列,然後將第二個放在第二行第一列,檢查是否滿足規則,如果滿足則進入第三個的放 置...
資料結構演算法爬坑日記八
思想 通過一次排序將一組資料分為兩部分,一部分全部比另一部分小,然後對兩部分分別再進行快排,迴圈此操作,直到不能再分割,便得到乙個有序序列 實現 快速排序 public class quicksort sort arr,0,arr.length 1 system.out.println arrays...