大根堆的删除c语言,大根堆和小根堆的C语言实现
大根堆小根堆的實(shí)現(xiàn):以PPT形式呈現(xiàn)大根堆構(gòu)建的理論過(guò)程
1、首先涉及到一個(gè)堆的調(diào)整,這也是算法的核心部分。假設(shè)樹中,節(jié)點(diǎn)i的子樹已經(jīng)為兩個(gè)大根堆。這兩個(gè)子樹再加上i節(jié)點(diǎn)的話,可能是大根堆也可能不是,因此需要對(duì)節(jié)點(diǎn)i進(jìn)行調(diào)整。若i小于left(i) or right(i),需要將i下移。
2、這是一個(gè)例子,需要將4下移。滿足大根堆的性質(zhì)。
3、大根堆的調(diào)整算法。假設(shè)i節(jié)點(diǎn)的兩個(gè)子樹已經(jīng)是大根堆。對(duì)應(yīng)代碼中MaxHeapify()函數(shù)。
4、算法正確性分析。
5、構(gòu)建大根堆的過(guò)程中,只需要考慮n/2 + 1 之前的節(jié)點(diǎn),因?yàn)橹蟮墓?jié)點(diǎn)都是葉節(jié)點(diǎn)。
6、構(gòu)建大根堆的算法。對(duì)應(yīng)代碼中MaxHeapCreat()函數(shù)
#include
#include
#include
#include
#include
/*
目的:建立大根堆,也可以變成小根堆,
核心:堆的調(diào)整
輸入:一系列來(lái)自文件的整數(shù)。文件中整數(shù)以空格隔開
輸出:大根堆
*/
void Swap(uint32_t* array, uint32_t i, uint32_t j)
{
assert(array);
uint32_t tmp;
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
/*大根堆調(diào)整*/
void MaxHeapify(uint32_t* array, uint32_t heapSize, uint32_t currentNode)
{
uint32_t leftChild, rightChild, largest;
leftChild = 2*currentNode + 1;
rightChild = 2*currentNode + 2;
if(leftChild < heapSize && array[leftChild] > array[currentNode])
largest = leftChild;
else
largest = currentNode;
if(rightChild < heapSize && array[rightChild] > array[largest])
largest = rightChild;
if(largest != currentNode)
{
Swap(array, largest, currentNode);
MaxHeapify(array, heapSize, largest);
}
}
/*構(gòu)建大根堆*/
void MaxHeapCreat(uint32_t* array, uint32_t heapSize)
{
int i;
for(i = heapSize/2; i >= 0; i--)
{
MaxHeapify(array, heapSize, i);
}
}
/*小根堆調(diào)整*/
void MinHeapify(uint32_t* array, uint32_t heapSize, uint32_t currentNode)
{
uint32_t leftChild, rightChild, minimum;
leftChild = 2*currentNode + 1;
rightChild = 2*currentNode + 2;
if(leftChild < heapSize && array[leftChild] < array[currentNode])
minimum = leftChild;
else
minimum = currentNode;
if(rightChild < heapSize && array[rightChild] < array[minimum])
minimum = rightChild;
if(minimum != currentNode)
{
Swap(array, minimum, currentNode);
MinHeapify(array, heapSize, minimum);
}
}
/*構(gòu)建小根堆*/
void MinHeapCreat(uint32_t* array, uint32_t heapSize)
{
int i;
for(i = heapSize/2; i >= 0; i--)
{
MinHeapify(array, heapSize, i);
}
}
int main()
{
uint32_t tmp;
uint32_t *array;
array = malloc(sizeof(uint32_t));
int i, heapSize = 0;
/*從文件中讀出待排序數(shù)據(jù)*/
char* filePathway = "C:/Users/Administrator/Desktop/data.txt";
FILE* fp;
fp = fopen(filePathway, "rb");
if(!fp)
{
fprintf(stderr, "Can not open file correctly\n");
}
while(!feof(fp))
{
fscanf(fp, "%d", &tmp);
heapSize++;
array = realloc(array, sizeof(uint32_t) * (heapSize ));
if(array == NULL)
{
fprintf(stderr, "realloc error!\n");
return 1;
}
array[heapSize - 1] = tmp;
}
printf("The origen dataset:\n");
for(i = 0; i < heapSize; i++)
{
printf("%d\t", array[i]);
}
printf("\n");
/*構(gòu)建小根堆并輸出*/
MinHeapCreat(array, heapSize);
printf("Output the MinHeap:\n");
for(i = 0; i < heapSize; i++)
{
printf("%d\t", array[i]);
}
printf("\n");
/*構(gòu)建大根堆并輸出*/
MaxHeapCreat(array, heapSize);
printf("Output the MaxHeap:\n");
for(i = 0; i < heapSize; i++)
{
printf("%d\t", array[i]);
}
free(array);
fclose(fp);
return 0;
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的大根堆的删除c语言,大根堆和小根堆的C语言实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 二分法在数组内查找数c语言,C++二分法
- 下一篇: android最新知识点总结,学习and