前面写过一篇文章,用的递归的方式做的,这个是按照字典序来写的代码。同时也是c++标准库里面的代码,next_permutaion,非常精炼。
// 字典序的排列,找到下一个字典序的排列
#include <iostream>
#include <cstdlib>
#include <cstring>
const int N = 1024;
///
void swap_value(char &val1, char &val2)
{
char tmp = val1;
val1 = val2;
val2 = tmp;
}
void reverse(char *key, int from, int to)
{
if (to <= from)
return;
int len = to - from + 1;
int index = len / 2;
int i = 0;
int ind1 = 0;
int ind2 = 0;
for (i = 0; i < index; i++)
{
ind1 = from + i;
ind2 = to - i;
swap_value(key[ind1], key[ind2]);
}
return;
}
bool string_permutation(char *key, int len);
void quicksort(char *key, int low, int high)
{
if (low >= high)
return;
int i = low;
int j = high;
char val = key[j];
while (i < j)
{
while (i < j && key[i] <= val)
i++;
key[j] = key[i];
while (i < j && key[j] > val)
j--;
key[i] = key[j];
}
key[i] = val;
quicksort(key, low, i-1);
quicksort(key, i+1, high);
}
bool string_permutation(char *key, int len)
{
int i = 0;
// 找到第一个升序的一个值 val
for (i = len-2; i >= 0; i--)
{
if (key[i] >= key[i+1])
continue;
break;
}
if (i < 0)
{
return false;
}
int k = 0;
// 在i后面找到第一个比val大的值
for (k = len-1; k>i; k--)
{
if (key[k] <= key[i])
continue;
break;
}
// 交换其值
swap_value(key[i], key[k]);
// 倒序,然后输出
reverse(key, i+1, len-1);
return true;
}
int main(int argc, char *argv[])
{
char line[N] = "cbcd";
std::cout << "key string " << line << std::endl;
int len = strlen(line);
quicksort(line, 0, len-1);
std::cout << line << std::endl;
bool flag;
flag = true;
while (flag)
{
flag = string_permutation(line, len);
if (flag)
std::cout << line << std::endl;
}
return 0;
}