大根堆的删除c语言,大根堆和小根堆的C语言实现
大根堆小根堆的實現:以PPT形式呈現大根堆構建的理論過程
1、首先涉及到一個堆的調整,這也是算法的核心部分。假設樹中,節點i的子樹已經為兩個大根堆。這兩個子樹再加上i節點的話,可能是大根堆也可能不是,因此需要對節點i進行調整。若i小于left(i) or right(i),需要將i下移。
2、這是一個例子,需要將4下移。滿足大根堆的性質。
3、大根堆的調整算法。假設i節點的兩個子樹已經是大根堆。對應代碼中MaxHeapify()函數。
4、算法正確性分析。
5、構建大根堆的過程中,只需要考慮n/2 + 1 之前的節點,因為之后的節點都是葉節點。
6、構建大根堆的算法。對應代碼中MaxHeapCreat()函數
#include
#include
#include
#include
#include
/*
目的:建立大根堆,也可以變成小根堆,
核心:堆的調整
輸入:一系列來自文件的整數。文件中整數以空格隔開
輸出:大根堆
*/
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;
}
/*大根堆調整*/
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);
}
}
/*構建大根堆*/
void MaxHeapCreat(uint32_t* array, uint32_t heapSize)
{
int i;
for(i = heapSize/2; i >= 0; i--)
{
MaxHeapify(array, heapSize, i);
}
}
/*小根堆調整*/
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);
}
}
/*構建小根堆*/
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;
/*從文件中讀出待排序數據*/
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");
/*構建小根堆并輸出*/
MinHeapCreat(array, heapSize);
printf("Output the MinHeap:\n");
for(i = 0; i < heapSize; i++)
{
printf("%d\t", array[i]);
}
printf("\n");
/*構建大根堆并輸出*/
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;
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的大根堆的删除c语言,大根堆和小根堆的C语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分法在数组内查找数c语言,C++二分法
- 下一篇: 北京环球影城未来水世界特技表演有高空跳水