编写函数align_n,将size的低n位(即:0到n-1位)清零,如果清零前size的低n位不为全零,则在第n位上加1。n满足32>n>0。
align_n的函数原型:
unsigned int align_n(unsigned int size, int n);
size(十六进制),n(十进制)
align_n的运算结果(十六进制)
输入例子1:
0x7,3
输出例子1:
0x8
输入例子2:
0x8,3
输出例子2:
0x8
输入例子3:
0x1,3
输出例子3:
0x8
#include
using namespace std;
unsigned int align_n(unsigned int size, int n) {
bool flag = false;
for (int i = 0; i < n; i++) {
if (size & 1)
flag = true;
size >>= 1;
}
size += flag;
return size << n;
}
int main() {
unsigned int size, n;
scanf("%x,%d", &size, &n);
printf("0x%x", align_n(size, n));
return 0;
}
函数heap_sort使用堆排序方法对数组arr进行排序,排序后数据为降序。相关代码如下,请补充缺失部分。
输入描述:
第一行为数据个数 第二行为输入数据
输出描述:
排序过程的中间数据,及已经排好序的数据
输入例子1:
10 100 32 3 6 24 86 23 90 78 3
static void heap_arrange(int arr[], int cur, int cnt) //调整为小顶堆
{
int heaptop_val = arr[cur]; //堆顶的值
while (cur < cnt) {
int left = 2 * cur + 1;
int right = 2 * cur + 2;
int min = -1;
int min_val = heaptop_val;
if (left < cnt && arr[left] < min_val) { //检查是否比左节点大
min = left;
min_val = arr[left];
}
if (right < cnt && arr[right] < min_val) {//检查是否比右节点大
min = right;
min_val = arr[right];
}
if (min == -1)
break;
arr[cur] = min_val;
cur = min;
}
arr[cur] = heaptop_val;
}
有一个节点数组,需要创建一棵最优二叉树,即每个节点的权值乘以节点在树中的长度,然后相加得到的值最小。以下图一为例,节点数组的[A,B,C,D,E]的权值分别为[15,7,6,6,5],构建好的最优二叉树见图二。
相关框架代码已经给出,请补充缺失部分,保证程序正常运行,输出预期结果。
输入描述:
第一行为数据个数 第二行为权值(整数)
输出描述:
构建的二叉树(用于绘图软件生成对应的二叉树图形)
输入例子1:
5 15 7 6 6 5
输出例子1:
```mermaid graph TD n0[n0:15] n0 --> n8 n1[n1:7] n1 --> n6 n2[n2:6] n2 --> n5 n3[n3:6] n3 --> n6 n4[n4:5] n4 --> n5 n5((11)) n5 --> n7 n6((13)) n6 --> n7 n7((24)) n7 --> n8 n8((39)) ```
#include
#include
#include
static void heap_arrange(int arr[], int cur, int cnt);
static int heap_verify(int arr[], int cnt)
{
int i;
for (i = 0; i < cnt / 2; ++i) {
int lhs = 2 * i + 1;
int rhs = 2 * i + 2;
if (lhs < cnt && arr[i] > arr[lhs]) {
fprintf(stderr, "arr[%d]:%d > arr[%d]:%d\n", i, arr[i], lhs, arr[lhs]);
return -1;
}
if (rhs < cnt && arr[i] > arr[rhs]) {
fprintf(stderr, "arr[%d]:%d > arr[%d]:%d\n", i, arr[i], rhs, arr[rhs]);
return -1;
}
}
return 0;
}
static void heap_print(int arr[], int cnt)
{
int layer = 0, num = 0;
for (layer = 0; num < cnt; ++layer) {
int i = 0;
for (i = 0; i < (1 << layer) && num < cnt; ++i)
printf("%3d ", arr[num++]);
printf("\n");
}
}
static void heap_sort(int arr[], int cnt)
{
int i;
printf("origin:\n");
heap_print(arr, cnt);
// 建堆
for (i = cnt / 2 - 1; i >= 0; --i) {
heap_arrange(arr, i, cnt);
}
printf("make heap:\n", i);
heap_print(arr, cnt);
assert(heap_verify(arr, cnt) == 0);
for (i = cnt - 1; i > 0; --i) {
int tmp;
tmp = arr[0];
arr[0] = arr[i];
arr[i] = tmp;
printf("sort i=%d\n", i);
heap_print(arr, cnt);
heap_arrange(arr, 0, i);
heap_print(arr, cnt);
assert(heap_verify(arr, i) == 0);
}
printf("sorted:\n");
heap_print(arr, cnt);
}
static int input(int** arr, int* size)
{
int i;
int ret;
ret = scanf( "%d", size);
if (ret != 1)
return -1;
*arr = (int*)malloc(sizeof(int) * (*size));
for (i = 0; i < *size; ++i) {
scanf( "%d", &(*arr)[i]);
}
return 0;
}
int main(int argc, char* argv[])
{
int* arr = NULL;
int cnt = 0;
int i;
if (input(&arr, &cnt) < 0) {
fprintf(stderr, "input error\n");
return 0;
}
heap_sort(arr, cnt);
return 0;
}
// 调整为小顶堆
static void heap_arrange(int arr[], int cur, int cnt) //调整为小顶堆
{
int heaptop_val = arr[cur]; //堆顶的值
while (cur < cnt) {
int left = 2 * cur + 1;
int right = 2 * cur + 2;
int min = -1;
int min_val = heaptop_val;
if (left < cnt && arr[left] < min_val) { //检查是否比左节点大
min = left;
min_val = arr[left];
}
if (right < cnt && arr[right] < min_val) {//检查是否比右节点大
min = right;
min_val = arr[right];
}
if (min == -1)
break;
arr[cur] = min_val;
cur = min;
}
arr[cur] = heaptop_val;
}