c语言按照字典序输出自然数 1 1 到 � n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
时间: 2024-09-28 20:05:09 AIGC 浏览: 223
在C语言中,生成从1到n的所有不重复元素的全排列通常采用递归回溯法,也叫做“next permutation”算法。这里是一个简单的示例代码,用于实现这个功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 比较两个整数数组是否相等
int compare(const void *a, const void *b) {
return (*(const int *)a - *(const int *)b);
}
// 排列函数,生成下一个排列
void generatePermutation(int arr[], int n, int i) {
if (i == n - 1) { // 如果已经到了最后一个位置,直接返回,因为到达最末就是最后一个排列
for (int j = 0; j < n; j++) {
printf("%d ", arr[j]);
}
puts("");
return;
}
int maxIndex = i; // 初始化最大值索引为当前遍历的位置
for (int k = i + 1; k < n; k++) { // 寻找大于arr[i]的最小值
if (arr[k] > arr[maxIndex]) {
maxIndex = k;
}
}
// 交换arr[i]和maxIndex位置上的元素,得到一个新的递增序列
swap(&arr[i], &arr[maxIndex]);
// 对剩余部分进行递归排列
generatePermutation(arr, n, i + 1);
// 对于递增序列,将arr[i+1]到end部分进行reverse操作,形成下一个排列
for (int j = n - 1; j > i; j--) {
swap(&arr[j], &arr[j - 1]);
}
}
// 交换两个元素的指针
void swap(void **a, void **b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int n;
printf("Enter the value of n: ");
scanf("%d", &n);
int* arr = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
qsort(arr, n, sizeof(int), compare); // 先对数组进行升序排序
generatePermutation(arr, n, 0); // 开始生成排列
free(arr);
return 0;
}
```
阅读全文
相关推荐

















