:::block-1
:::block-1
:::block-1
typedef int phpDataType;
typedef struct Heap
{
phpDataType* a;
int size;
int capacity;
}Heap;
void AdjustDwon(int* a, int n, int parent)
{
assert(a);
int child = parent * 2 + 1;
while (child < n)
{
if (child + 1 < n && a[child] > a[child + 1])
{
child++;
}
if (a[parent] > a[child])
{
Swap(&a[parent], &a[child]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void AdjustUp(Heap* php,int child)//堆,要调整的位置
{
assert(php);
int parent = (child - 1) / 2;
while (child > 0)//子节点不等于零代表有父节点,可继续调整
{
if (php->a[child] < php->a[parent])//给定条件
{
Swap(&(php->a[child]), &(php->a[parent]));//交换子父节点
}
else
{
break;//如果不满足条件,则跳出进入下一次调整
}
child = parent;
parent = (child - 1) / 2;
}
}
//(n - 1 - 1)/2的含义是((n-1)-1)/2,n-1是数组最后一个元素的下标,减一后整体处二是为了找他的父亲节点,因为叶子节点没有必要去向下调整。
for (int i = (n - 1 - 1)/2; i >= 0; i--)
{
AdjustDwon(a, n, i);
}
for (int i = 1; i < n; i++)
{
AdjustUp(a, i);
}
void InitHeap(Heap* php)
{
php->capacity = 0;
php->size = 0;
php->a = NULL;
}
void HeapPush(Heap* php, phpDataType x)//堆,需要插入的数据
{
assert(php);
phpDataType NewCapacity = php->capacity == 0 ? 4 : 2 * php->capacity;
if (php->capacity == php->size)
{
phpDataType* tmp = (phpDataType*)realloc(php->a,NewCapacity*sizeof(phpDataType));
assert(tmp);
php->capacity = NewCapacity;
php->a = tmp;
}
php->a[php->size] = x;
php->size++;
AdjustUp(php,php->size-1);//要调整的对,需要向上调整的新的位置
}
void HeapDestory(Heap* php)
{
assert(php);
php->size = 0;
php->capacity = 0;
free(php->a);
}
void HeapPop(Heap* php)
{
assert(php);
assert(php->size);
int top = 0;
int end = php->size - 1;
Swap(&(php->a[top]), &(php->a[end]));
php->size--;
AdjustDown(php);
}
phpDataType HeapTop(Heap* php)
{
assert(php);
int top = 0;
return php->a[top];
}
int HeapSize(Heap* php)
{
assert(php);
return php->size;
}
int HeapEmpty(Heap* php)//返回1代表该堆为空,返回零代表非空
{
assert(php);
return php->size == 0;
}
void HeapSort(int* a, int n)
{
assert(a);
//建堆
for (int i = (n - 1 - 1)/2; i >= 0; i--)
{
AdjustDwon(a, n, i);
}
//排序
while (n)
{
Swap(&a[0], &a[n - 1]);
n--;
AdjustDwon(a, n, 0);
}
}
void PrintTopK(int k)
{
const char* file = "data.txt";
FILE* fin = fopen(file, "r");
if (fin == NULL)
{
perror("fopen error");
return;
}
int* a = (int*)malloc(k * sizeof(int));
for (int i = 0; i < k; i++)
{
fscanf(fin, "%d", &a[i]);
}
//建堆
for (int i = (k - 1 - 1) / 2; i >= 0; i--)
{
AdjustDown(a,k,i);
}
int val = 0;
while (!feof(fin))
{
fscanf(fin, "%d", &val);
if (val > a[0])
{
a[0] = val;
AdjustDown(a, k, 0);
}
}
for (int i = 0; i < k; i++)
{
printf("%d\n", a[i]);
}
}
:::