题目描述
输入样例:
5 3
46 23 26 24 10
5 4 3
输出样例:
24 23 10
46 23 10
26 10
注意点
1. x = ++i; 与x = i ++;
-
i++和++i是C语言运算符,i++是后缀递增的意思,++i是前缀递增的意思。
-
i++是后缀递增的意思,i++是先进行表达式运算,再进行自增运算。把i++的运算过程拆分开,等效于i=i+1可以看到运算结果是一致的。
-
x = i ++; //先让x变成i的值1,再让i加1
-
++i是前缀递增的意思,++i是先进行自增或者自减运算,再进行表达式运算。运算结果可以发现,仅从i的值来看,++i和i++最终的i值是一样的,都是i自增加了1。
-
x = ++i; //先让i加1, 再让x变成i的值1
基础功不怎么样,知道调试才发现错误。
哨兵
- 数组的第1个元素(Data[0])为哨兵,给他设置个最小值(最小堆);
- 当我们进行插入时,当我们发现父节点的值大于要插入的值时,就进入循环;若要插入的值要放在最上面时(Data[1]),此时,Data[1]与哨兵进行比较,由于哨兵我们给他设置了很小的值,因此循环结束。
- 除了哨兵的方法,我们也可以加一个条件。当i>1,时,循环继续,当i=1时,直接将插入的值放到Data[1]的位置。
#include <stdio.h>
#include <stdlib.h>
#define MinData -1000 /* 该值应根据具体情况定义为小于堆中所有可能元素的值 */
typedef int ElementType ;
typedef struct HNode *Heap; /* 堆的类型定义 */
struct HNode{
ElementType *Data; /* 存储元素的数组 */
int Size; /* 堆中当前元素个数 */
int Capacity; /* 堆的最大容量 */
};
typedef Heap MinHeap;
MinHeap CreateHeap(int MaxSize);
bool IsFull(MinHeap H);
void Insert(MinHeap H,int data);
void PrintPath(MinHeap H,int index);
MinHeap ReadHeap(MinHeap H,int N);
MinHeap PrintHeap(MinHeap H,int M);
int main()
{
int N,M;
MinHeap H;
scanf("%d %d",&N,&M);
H = CreateHeap(N);
ReadHeap(H,N);
PrintHeap(H,M);
}
MinHeap CreateHeap(int MaxSize)
{
/* 创建容量为MaxSize的空的最小堆 */
MinHeap H = (MinHeap)malloc(sizeof(struct HNode));
H->Capacity = MaxSize;
H->Size = 0;
H->Data = (ElementType *)malloc((MaxSize+1)*sizeof(ElementType));
H->Data[0] = MinData; /* 定义"哨兵"为小于堆中所有可能元素的值*/
return H;
}
bool IsFull(MinHeap H)
{
return (H->Size == H->Capacity);
}
void Insert(MinHeap H,int data)
{
/* 将元素data插入最小堆H,其中H->Data[0]已经定义为哨兵 */
int i;
if(IsFull(H))
{
printf("the heap is full.\n");
}
else
{
// 先让size加1,再赋给i
i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置,也就是要插入的位置 */
for(;H->Data[i/2] > data;i/= 2)
{
// 将父元素放到下面来
H->Data[i] = H->Data[i/2];
}
H->Data[i] = data; /* 将X插入 */
}
}
MinHeap ReadHeap(MinHeap H,int N)
{
int i;
int data;
for (i = 0;i < N; i++)
{
scanf("%d",&data);
Insert(H,data);
}
return H;
}
void PrintPath(MinHeap H,int index)
{
int i;
for(i = index;i!=0;i/=2)
{
printf("%d ",H->Data[i]);
}
}
MinHeap PrintHeap(MinHeap H,int M)
{
int i;
int index;
for (i = 0; i < M;i++)
{
scanf("%d",&index);
PrintPath(H,index);
if(i!=(M-1)) printf("\n");
}
}