c 模擬實現堆

2021-08-01 01:36:20 字數 1996 閱讀 8227

這次我們來模擬實現堆,首先堆是乙個完全二叉樹,每個元素都有乙個關鍵碼,儲存相應的資料,堆分為最大堆和最小堆。

最大堆:

最大堆任意乙個節點都大於它左右孩子的關鍵碼,堆頂元素最大。

最小堆:

最小堆任意乙個節點都小於它左右孩子的關鍵碼,堆頂元素最小。

因此我們得出以下結論:

堆儲存在下標為0開始計數的陣列中,因此在堆中給定小標為i的結點時:

1、如果i=0,結點i是根節點,沒有雙親節點;否則結點i的雙親結點為結點(i-1)/2

2、如果2*i+1>n-1,則結點i無左孩子,否則結點i的左孩子為結點2*i+1

3、如果2*i+2>n-1,則結點i無右孩子,否則結點i的右孩子為結點2*i+2

堆的建立:

最小堆與最大堆

首先我們來分析下堆所支援的操作:

template>//這裡第二個引數是乙個比較器,less或者是greater

class heap

;

**如下:

templatestruct less//小堆的實現

};templatestruct greater//大堆的實現

};

2、堆的生成

template>//這裡第二個引數是乙個比較器,less或者是greater

class heap

heap(const t array, size_t size)

for (int j = (_heap.size() - 2) / 2; j >= 0; j--)}};

3、向上向下調整操作

堆的向下調整演算法和向上調整演算法是堆的核心兩個演算法,它們的作用為:

堆的向下調整演算法:用於建立堆,可以自行選擇建立大堆或者建立小堆。

堆的向上調整演算法:用於插入元素的時候使用。

void _adjustdown(size_t parent)

if (child<_heap.size com _heap>

else

break; }}

void _adjustup(size_t child)

else

break;

}}

下面給出完整**:

#include #include using namespace std;

templatestruct less

};templatestruct greater

};// 小堆

template>

class heap

heap(const t array, size_t size)

for (int j = (_heap.size() - 2) / 2; j >= 0; j--)

}void insert(const t& data)

void remove()

size_t size()const

bool empty()const

const t& top()const

protected:

//堆的插入

void _adjustdown(size_t parent)

if (child<_heap.size com _heap>

else

break;

} }void _adjustup(size_t child)

else

break;

} }private:

vector_heap;

};

C 模擬實現List

雙向鍊錶 include includeusing namespace std typedef nodenode templatestruct node t data 鍊錶中的資料 node pnext 下乙個節點 node ppre 前乙個節點 templateclass list templat...

C 模擬實現strncmp

首先簡單介紹下這個函式 int strncmp const char string1,const char string2,size t count 比較字串,所以必須加上const使字串不能改變 該函式的標頭檔案是 include 0 string1子字串小於string2子字串 0 string...

C 模擬實現strcat

模擬實現strcat 概念 將兩個char型別的字串連線,中間無空格 解題思路 1 定義兩個字串陣列,再定乙個陣列用於存放這兩個陣列的值 2 為了使兩個字串相連,拷貝第二個陣列裡面的值是,需要獲取第乙個陣列的 0 儲存的地方,將 0 和 0 之後的變成第二個陣列的值 3 列印第三個陣列。執行結果 另...