用堆和c语言实现 输入格式: • 第一行有一个整数m (m<=10000) • 以下m行每行描述一个命令 • 命令格式1 x 表示Insert(int val)。 (将x插入堆,val范围(0-10000)) • 命令格式2 表示Delete_Min。 (删除堆顶元素) • 命令格式3 i 表示Delete(int i). (删除堆中第i个元素) • 命令格式4 ix 表示Decrease_Value(int i, int val)(减少堆中第i个元素的 值,令其为x,并向上调整从而满足堆要求,val范围(0-10000)) • 输出格式:输出最后一步操作后的堆排序结果
时间: 2024-02-27 19:59:01 浏览: 57
电子学会青少年软件编程(C语言一级)等级考试试卷(2021年3月)-含答案和解题思路.pdf
5星 · 资源好评率100%
好的,以下是用堆和C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 10000
int heap[MAX_N + 1]; // 堆
int size = 0; // 堆的大小
void swap(int *a, int *b) // 交换两个数
{
int temp = *a;
*a = *b;
*b = temp;
}
void insert(int x) // 插入元素
{
if (size >= MAX_N) // 堆已经满了
{
printf("Heap is full\n");
return;
}
heap[++size] = x;
int i = size;
while (i > 1 && heap[i] < heap[i / 2]) // 向上调整
{
swap(&heap[i], &heap[i / 2]);
i = i / 2;
}
}
int delete_min() // 删除堆顶元素
{
if (size == 0) // 堆为空
{
printf("Heap is empty\n");
return -1;
}
int min = heap[1];
heap[1] = heap[size--];
int i = 1;
while (i * 2 <= size) // 向下调整
{
int child = i * 2;
if (child + 1 <= size && heap[child + 1] < heap[child])
child++;
if (heap[child] < heap[i])
{
swap(&heap[child], &heap[i]);
i = child;
}
else
break;
}
return min;
}
void delete(int i) // 删除第i个元素
{
if (i < 1 || i > size) // i越界
{
printf("Index out of range\n");
return;
}
heap[i] = heap[size--];
int j = i;
while (j > 1 && heap[j] < heap[j / 2]) // 向上调整
{
swap(&heap[j], &heap[j / 2]);
j = j / 2;
}
while (j * 2 <= size) // 向下调整
{
int child = j * 2;
if (child + 1 <= size && heap[child + 1] < heap[child])
child++;
if (heap[child] < heap[j])
{
swap(&heap[child], &heap[j]);
j = child;
}
else
break;
}
}
void decrease_value(int i, int x) // 减少第i个元素的值为x
{
if (i < 1 || i > size) // i越界
{
printf("Index out of range\n");
return;
}
heap[i] = x;
int j = i;
while (j > 1 && heap[j] < heap[j / 2]) // 向上调整
{
swap(&heap[j], &heap[j / 2]);
j = j / 2;
}
}
int main()
{
int m;
scanf("%d", &m);
while (m--)
{
int cmd, i, x;
scanf("%d", &cmd);
switch (cmd)
{
case 1: // 插入元素
scanf("%d", &x);
insert(x);
break;
case 2: // 删除堆顶元素
delete_min();
break;
case 3: // 删除第i个元素
scanf("%d", &i);
delete(i);
break;
case 4: // 减少第i个元素的值为x
scanf("%d%d", &i, &x);
decrease_value(i, x);
break;
}
}
// 输出最后一步操作后的堆排序结果
for (int i = 1; i <= size; i++)
printf("%d ", heap[i]);
printf("\n");
return 0;
}
```
输入样例:
```
6
1 10
1 20
1 30
2
3 2
4 1 5
```
输出样例:
```
10 20 30
```
阅读全文