#include <stdio.h>
#include <stdbool.h>
/**
* @description: 排序
* @param {int} data 待排序数组
* @param {int} data1 排序数组
* @param {bool} flat 标志数组对应位置是否已使用
* @param {int} count 数组长度
* @param {int} n 排序数组的下标
* @return {*} void
*/
void Array(int data[], int data1[], bool flat[], int count, int n)
{
if (n > count)//如果n大于数组的长度,递归的回归条件
return;
if (n == count) //如果n刚好等于count,表示已经排好一个,将该数组输出
{
for (int i = 0; i < count; i++)
printf("%d", data1[i]);
printf("\n");
}
for (int i = 0; i < count; i++)
{
if (!flat[i])//flat[i]为false,表示该为数据还没有被使用过
{
flat[i] = true;
data1[n] = data[i];//从待排序数组中拷贝数据到排序数组中,注意这两个数组的下标
Array(data, data1, flat, count, (n + 1));
flat[i] = false;//必须要将标志位重新置为false,否则就只能得到一个相同结果
}
}
}
/**
* @description: 组合
* @param {int} data 数组
* @param {int} data1 存放组合的数组
* @param {int} data_len 数组的长度
* @param {int} data1_len 组合的长度
* @param {int} data_i 数组的下标
* @param {int} data1_i 存放组合的数组的下标
* @return {*}
*/
void Group(int data[], int data1[], int data_len, int data1_len, int data_i, int data1_i)
{
if (data_i > data_len)
return;
if (data1_i == data1_len)
{
for (int i = 0; i < data1_len; i++)
printf("%d ", data1[i]);
printf("\n");
return;
}
data1[data1_i++] = data[data_i];
Group(data, data1, data_len, data1_len, data_i + 1, data1_i);
data1_i--;
Group(data, data1, data_len, data1_len, data_i + 1, data1_i);
}
int main()
{
int data[] = {1, 2, 5, 10};
int data1[4] = {0};
bool flat[4] = {0};
//Array(data,data1,flat,4,0);
for (int i = 0; i < 4; i++)
{
Group(data, data1, 4, i + 1, 0, 0);
}
return 0;
}
>>转载自 C语言实现排序组合