查找选择题
排序错误题
(1)从最后一个非叶子节点开始,逐层向前调整,使每个节点的值都小于其子节点。然后遍历检查是否满足小根堆的性质,通过逐步调整和检查,最终判断顺序表是否构成小根堆。
(2)// 建立小根堆的调整函数
void HeapAdjust(SqList *L, int s, int m) {
int temp, j;
temp = L->elem[s];
for (j = 2 * s; j <= m; j *= 2) {
if (j < m && L->elem[j] > L->elem[j + 1]) {
j++; // 指向较小的子节点
}
if (temp <= L->elem[j]) {
break; // 调整结束
}
L->elem[s] = L->elem[j];
s = j; // 继续向下调整
}
L->elem[s] = temp; // 将原始根节点放到合适的位置
}
// 判断顺序表是否为小根堆
int IsMinHeap(SqList *L) {
// 从最后一个非叶子节点开始向前调整
for (int i = L->length / 2; i > 0; i--) {
HeapAdjust(L, i, L->length);
}
// 遍历检查是否满足小根堆的性质
for (int i = 1; i <= L->length / 2; i++) {
if (2 * i <= L->length && L->elem[i] > L->elem[2 * i]) {
return 0; // 不满足小根堆性质
}
if (2 * i + 1 <= L->length && L->elem[i] > L->elem[2 * i + 1]) {
return 0; // 不满足小根堆性质
}
}
return 1; // 满足小根堆性质
}