資料結構基礎 19 堆與堆排序

2021-09-21 16:11:45 字數 2859 閱讀 7369

首先讓我們回顧一下完全二叉樹的兩個性質:

性質1:具有n個結點的完全二叉樹的深度為[logn](向下取整)+1。

性質2:

若對含 

n 個結點的完全二叉樹從上到下且從左至右進行 

1 至 

n 的編號,則對完全二叉樹中任意乙個編號為 

i 的結點:

(1) 若 i=1,則該結點是二叉樹的根,無雙親,否則,編號為 [i/2](向下取整)的結點為其雙親結點;

(2) 若 2i>n,則該結點無左孩子,否則,編號為 2i 的結點為其左孩子結點;

(3) 若 2i+1>n,則該結點無右孩子結點,否則,編號為2i+1 的結點為其右孩子結點。

從上圖可以看出, 如果完全二叉樹從上到下且從左至右進行從0至n-1進行編號,則對完全二叉樹的性質需要修改如下:

(1) 若 i=0,則該結點是二叉樹的根,無雙親,否則,編號為 [(i-1)/2](向下取整)的結點為其雙親結點;

(2) 若 2i+1>n,則該結點無左孩子,否則,編號為 2i+1 的結點為其左孩子結點;

(3) 若 2i+2>n,則該結點無右孩子結點,否則,編號為2i+2 的結點為其右孩子結點。

堆是滿足下列性質的數列:

(小頂堆)

(大頂堆)

大頂堆的設計

template class maxheap

;

大頂堆的實現

//構造

template maxheap::maxheap(int _maxsize)

: maxsize(_maxsize),currentsize(0)

//析構

template maxheap::~maxheap()

//判空

template bool maxheap::isempty() const

堆頂元素

//檢視堆頂元素

template const type &maxheap::top() const

插入元素

//插入

template void maxheap::push(const type &item)

//將元素插入到堆的第乙個空位置上

heaparray[currentsize] = item;

//維護堆的性質:向上滲透

trickup(currentsize);

++ currentsize;

}

//向上滲透, 將剛剛插入的元素移動到合適的位置上

template void maxheap::trickup(int index)

//插入

heaparray[index] = bottom;

}

//將堆的大小加倍

template void maxheap::resize()

delete heaparray;

heaparray = newheap;

maxsize = newsize;

}

刪除堆頂元素

//刪除

template void maxheap::pop()

//顯示釋放堆頂元素

heaparray[0].~type();

//直接將最有乙個元素放到堆頂,

//並且currentsize-1

heaparray[0] = heaparray[-- currentsize];

//此時如果破壞了堆的性質:向下滲透

trickdown(0);

}

//向下滲透

template void maxheap::trickdown(int index)

//插入

heaparray[index] = top;

}

堆排序就是將元素乙個乙個插入到堆中, 然後再乙個乙個的取出來;

//堆排序

template void heapsort(type *begin, type *end)

}template void heapsort(type *array, int arraysize)

附-測試**

:

int main()

heapsort(array, 20);

cout << endl;

for (int i = 0; i < 20; ++i)

cout << endl;

return 0;

}

資料結構基礎 19 堆與堆排序

首先讓我們回顧一下完全二叉樹的兩個性質 性質1 具有n個結點的完全二叉樹的深度為 logn 向下取整 1。性質2 若對含 n 個結點的完全二叉樹從上到下且從左至右進行 1 至 n 的編號,則對完全二叉樹中任意乙個編號為 i 的結點 1 若 i 1,則該結點是二叉樹的根,無雙親,否則,編號為 i 2 ...

資料結構 堆與堆排序

堆其實是從完全二叉樹演變過來的並且用來儲存資料的,什麼是完全二叉樹呢?完全二叉樹就是 若設二叉樹的深度為h,除第h層外,其它各層 1 h 1 的結點數都達到最大個數,第h層所有的結點都連續集中 在最左邊,這就是完全二叉樹。我們知道二叉樹可以用陣列模擬,堆自然也可以。現在讓我們來畫一棵完全二叉樹 從圖...

堆資料結構與堆排序

堆資料結構 堆 二叉堆 是近似的完全二叉樹,最底層允許不滿,堆的相關,陣列長度length,heap size有效長度 堆的有效元素,未排序的數目 heap size堆雖然很像二叉樹,但是我的理解就是用二叉樹的邏輯,但是最主要的區別在,堆的儲存是用陣列,只是用下標來幫助理解 堆的儲存結構 從上往下,...