使用 Bose-Nelson 算法计算 20 个整数的数量我创建了一个简单的函数,它对使用名称索引的 20 个整数进行排序,使用 this site。然后你只需要返回 3 个最大的整数。
#include <stdio.h>
struct max3_from_20_s {
int first;
int second;
int third;
} max3_from_20(
int v0,
int v1,
int v2,
int v3,
int v4,
int v5,
int v6,
int v7,
int v8,
int v9,
int v10,
int v11,
int v12,
int v13,
int v14,
int v15,
int v16,
int v17,
int v18,
int v19
) {
#define SORT20_MIN(a, b) ((a<b)?a:b)
#define SORT20_MAX(a, b) ((a<b)?b:a)
#define SORT20_SWAP(idx1, idx2) do{ \
const int min = SORT20_MIN(v##idx1, v##idx2); \
const int max = SORT20_MAX(v##idx1, v##idx2); \
v##idx1 = min; \
v##idx2 = max; \
}while(0)
#define swap SORT20_SWAP
swap(0, 1);
swap(3, 4);
swap(5, 6);
swap(8, 9);
swap(10, 11);
swap(13, 14);
swap(15, 16);
swap(18, 19);
swap(2, 4);
swap(7, 9);
swap(12, 14);
swap(17, 19);
swap(2, 3);
swap(1, 4);
swap(7, 8);
swap(6, 9);
swap(12, 13);
swap(11, 14);
swap(17, 18);
swap(16, 19);
swap(0, 3);
swap(5, 8);
swap(4, 9);
swap(10, 13);
swap(15, 18);
swap(14, 19);
swap(0, 2);
swap(1, 3);
swap(5, 7);
swap(6, 8);
swap(10, 12);
swap(11, 13);
swap(15, 17);
swap(16, 18);
swap(9, 19);
swap(1, 2);
swap(6, 7);
swap(0, 5);
swap(3, 8);
swap(11, 12);
swap(16, 17);
swap(10, 15);
swap(13, 18);
swap(1, 6);
swap(2, 7);
swap(4, 8);
swap(11, 16);
swap(12, 17);
swap(14, 18);
swap(0, 10);
swap(1, 5);
swap(3, 7);
swap(11, 15);
swap(13, 17);
swap(8, 18);
swap(4, 7);
swap(2, 5);
swap(3, 6);
swap(14, 17);
swap(12, 15);
swap(13, 16);
swap(1, 11);
swap(9, 18);
swap(4, 6);
swap(3, 5);
swap(14, 16);
swap(13, 15);
swap(1, 10);
swap(2, 12);
swap(7, 17);
swap(4, 5);
swap(14, 15);
swap(3, 13);
swap(2, 10);
swap(6, 16);
swap(8, 17);
swap(4, 14);
swap(3, 12);
swap(5, 15);
swap(9, 17);
swap(8, 16);
swap(4, 13);
swap(3, 11);
swap(6, 15);
swap(9, 16);
swap(4, 12);
swap(3, 10);
swap(7, 15);
swap(4, 11);
swap(8, 15);
swap(7, 12);
swap(4, 10);
swap(9, 15);
swap(6, 11);
swap(8, 13);
swap(5, 10);
swap(9, 14);
swap(8, 12);
swap(6, 10);
swap(9, 13);
swap(8, 11);
swap(9, 12);
swap(7, 10);
swap(9, 11);
swap(8, 10);
swap(9, 10);
#undef swap
struct max3_from_20_s ret = {
v19, v18, v17,
};
return ret;
}
int main()
{
struct max3_from_20_s num = max3_from_20(
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
20, 19, 18, 17, 100, 15, 14, 13, 12, 11
);
printf("%d %d %d\n", num.first, num.second, num.third);
return 0;
}
将输出:
100 20 19
您可以使用任何变量名称,只需稍微修改宏并将交换调用中的每个数字替换为等效名称。
onlinegdb 提供实时版本。