Здесь у вас есть ленивая оцененная версия этого алгоритма, закодированная в C #:
static bool nextCombination(int[] num, int n, int k)
{
bool finished, changed;
changed = finished = false;
if (k > 0)
{
for (int i = k - 1; !finished && !changed; i--)
{
if (num[i] < (n - 1) - (k - 1) + i)
{
num[i]++;
if (i < k - 1)
{
for (int j = i + 1; j < k; j++)
{
num[j] = num[j - 1] + 1;
}
}
changed = true;
}
finished = (i == 0);
}
}
return changed;
}
static IEnumerable Combinations<T>(IEnumerable<T> elements, int k)
{
T[] elem = elements.ToArray();
int size = elem.Length;
if (k <= size)
{
int[] numbers = new int[k];
for (int i = 0; i < k; i++)
{
numbers[i] = i;
}
do
{
yield return numbers.Select(n => elem[n]);
}
while (nextCombination(numbers, size, k));
}
}
И тестовая часть:
static void Main(string[] args)
{
int k = 3;
var t = new[] { "dog", "cat", "mouse", "zebra"};
foreach (IEnumerable<string> i in Combinations(t, k))
{
Console.WriteLine(string.Join(",", i));
}
}
Надеюсь, это поможет вам!
7.21.4 / 1 (C99), выделено мной:
Знак ненулевого значения, возвращаемого функциями сравнения memcmp, strcmp, а strncmp определяется знаком разницы значений первых пара символов ( оба интерпретируются как unsigned char ), которые различаются объектами по сравнению.
В C90 есть нечто подобное.
Обратите внимание, что strcoll () может быть более адаптирован, чем strcmp (), особенно если у вас есть символы вне базового набора символов.