请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。c语言实现
时间: 2024-09-25 07:08:55 浏览: 46
在C语言中,我们可以使用递归函数结合循环来生成并输出n个正整数的全排列。这是一个简单的算法,但需要注意的是,随着n的增长,全排列的数量会迅速增多,导致处理速度变慢。下面是一个基础的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 交换两个元素的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 生成n个数的全排列,base case: 当n=0时返回
int* generate_permutations(int n, int arr[], int index, int *perm) {
if (index == n) {
perm[n] = 0; // 用于结束递归
return perm;
}
for (int i = index; i < n; ++i) {
swap(&arr[index], &arr[i]); // 交换当前位置与下一个位置的数
perm[index] = arr[index]; // 保存当前排列
perm[index + 1] = generate_permutations(n, arr, index + 1, perm); // 递归处理剩余位
swap(&arr[index], &arr[i]); // 恢复原排列,准备下一次交换
}
return perm;
}
// 主函数
void print_permutations(int n) {
int arr[n];
int *perm = malloc(sizeof(int) * n);
for (int i = 0; i < n; ++i)
arr[i] = i + 1;
perm = generate_permutations(n, arr, 0, perm);
printf("Permutations of first %d numbers:\n", n);
for (int i = 0; perm[i] != 0; ++i) {
for (int j = 0; j <= i; ++j)
printf("%d ", perm[j]);
printf("\n");
}
free(perm);
}
int main() {
int tests[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
for (int i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) {
printf("For n = %d:\n", tests[i]);
clock_t start = clock();
print_permutations(tests[i]);
double time_taken = (double)(clock() - start) / CLOCKS_PER_SEC;
printf("Time taken: %.2f seconds\n", time_taken);
}
return 0;
}
```
这个程序首先初始化一个数组`arr`,然后递归地生成所有可能的排列,并打印出来。同时,它记录每个测试用例的运行时间。
阅读全文