這次我們來模擬實現堆,首先堆是乙個完全二叉樹,每個元素都有乙個關鍵碼,儲存相應的資料,堆分為最大堆和最小堆。
最大堆:
最大堆任意乙個節點都大於它左右孩子的關鍵碼,堆頂元素最大。
最小堆:
最小堆任意乙個節點都小於它左右孩子的關鍵碼,堆頂元素最小。
因此我們得出以下結論:
堆儲存在下標為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 列印第三個陣列。執行結果 另...