資料結構(八)二叉堆 及排序

2021-09-18 03:48:39 字數 2844 閱讀 2441

以下是我學習二叉堆的總結:

#include

#include

/** * 時間複雜度 o(log(n))

* 空間複雜度 o(1)

* int tree 和 int size 合起來表示裝堆的值的陣列

* int rootidx 表示要調整的結點的下標

*/// 向下調整的**

void

adjustdown

(int tree,

int size,

int rootidx)

// 不是葉子

int minidx = leftidx;

if(rightidx < size && tree[rightidx]

< tree[leftidx]

)// 最小孩子的下標就是 minidx

if(tree[rootidx]

<= tree[minidx]

)int t = tree[minidx]

; tree[minidx]

= tree[rootidx]

; tree[rootidx]

= t;

// 如果發生了交換,則下面的樹的堆性質可能被破壞了,繼續調整

adjustdown

(tree, size, minidx);}

void

adjustdown2

(int tree,

int size,

int rootidx)

// 如果不是葉子,找到最小孩子的下標

int minidx;if(

2* rootidx +

2>= size)

else

if(tree[

2* rootidx +1]

<= tree[

2* rootidx +2]

)else

// 拿最小孩子的值 和 要調整的根的值進行比較

if(tree[rootidx]

<= tree[minidx]

)else

}// 粗略看,時間複雜度是 o(n * log(n))

// 精確算,是 o(n)

// 找到最後乙個非葉子結點,開始整體向下調整

void

createheap

(int tree,

int size)

}#include

void

test()

;int size =

sizeof

(array)

/sizeof

(int);

createheap

(array, size)

;printf

("hello world\n");

}typedef

struct heap heap;

#include

#include

// 初始化二叉樹的順序表

void

heapinit

(heap *ph,

int array,

int size)

// 向上調整的**

void

adjustup

(int tree,

int size,

int child)

int parent =

(child -1)

/2;if

(tree[child]

>= tree[parent]

)int t = tree[child]

; tree[child]

= tree[parent]

; tree[parent]

= t;

adjustup

(tree, size, parent);}

// log(n)

// 尾插,之後向上調整

void

(heap *ph,

int v)

// o(log(n)) 每次出的是當前最小值

// 頭刪,之後向下調整

int(heap *ph)

void

test2()

;int size =

sizeof

(array)

/sizeof

(int);

heap heap;

heapinit

(&heap, array, size)

;for

(int i =

0; i <

3; i++

)printf

("after pop\n");

for(

int i =

0; i <

3; i++

)printf

("after push\n");

int size2 = heap.size;

for(

int i =

0; i < size2; i++)}

// 排降序,建小堆

// 建大堆,找出最大值後,會破壞堆結構

void

heapsort

(int array,

int size)

}// 測試

void

test3()

;int size =

sizeof

(array)

/sizeof

(int);

heapsort

(array, size)

;printf

("hello\n");

}

資料結構 八 二叉排序樹

基本操作 建立bst 查詢 插入乙個節點 中序遍歷 將得到遞增序列 刪除乙個節點 include include include pragma warning disable 4996 typedef struct mybst bst bst create 建立bst bst insert bst ...

資料結構 八 二叉樹

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹遍歷,就是按一定的規則和順序走遍二叉樹的所有結點,使每乙個結點都被訪問一次,而且只被訪問一次。設l d r分別表示遍歷左子樹 訪問根結點和遍歷右子樹,則對一棵二叉樹...

資料結構(八)二叉樹遍歷

二叉樹是一種樹形結構,遍歷就是要讓樹中的所有節點被且僅被訪問一次,即按一定規律排列成乙個線性佇列。二叉 子 樹是一種遞迴定義的結構,包含三個部分 根結點 n 左子樹 l 右子樹 r 根據這三個部分的訪問次序對二叉樹的遍歷進行分類,總共有6種遍歷方案 nlr lnr lrn nrl rnl和lnr。研...