C语言实现重复元素排列算法:列出所有不同排列
以下是一个递归的C语言算法来列出R的所有不同排列:
#include <stdio.h>
#include <string.h>
// 交换两个元素的值
void swap(char *x, char *y) {
char temp;
temp = *x;
*x = *y;
*y = temp;
}
// 列出R的所有不同排列
void permute(char *R, int start, int end) {
int i;
if (start == end) {
printf('%s\n', R); // 打印排列
} else {
for (i = start; i <= end; i++) {
// 如果当前元素与前面的元素相同,则跳过,避免重复排列
if (i != start && R[i] == R[start]) {
continue;
}
// 交换当前元素与第一个元素
swap(&R[start], &R[i]);
// 递归调用permute函数,固定第一个元素,对后面的元素进行排列
permute(R, start + 1, end);
// 恢复数组
swap(&R[start], &R[i]);
}
}
}
int main() {
char R[] = '1122'; // 要进行排列的元素
int n = strlen(R);
// 对R进行排序,以便在列出排列时跳过重复的元素
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (R[j] > R[j+1]) {
swap(&R[j], &R[j+1]);
}
}
}
permute(R, 0, n-1);
return 0;
}
这个算法的基本思想是通过递归的方式,将每个元素固定到排列的第一个位置,然后对剩下的元素进行排列。为了避免重复排列,我们在交换元素时,如果当前元素与前面的元素相同,则跳过。在主函数中,我们对要进行排列的元素进行排序,以便在列出排列时跳过重复的元素。
原文地址: https://www.cveoy.top/t/topic/ckgg 著作权归作者所有。请勿转载和采集!