字符串下一个排列,上一个排列,和随机排列
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 4096
void next_permutation(char *str); //下一个排列
void prev_permutation(char *str); //上一个排列
void random_shuffle(char *begin,char *end); //随机排列
int main()
{
char str[MAXLINE];
strncpy(str,"0123456789",MAXLINE);
int i;
for(i = 0;i < 10000;i++){
next_permutation(str);
}
printf("%s\n",str);
for(i = 0;i < 10000;i++){
prev_permutation(str);
}
printf("%s\n",str);
random_shuffle(str,str + strlen(str) - 1);
printf("%s\n",str);
return 0;
}
void swap(char *a,char *b)
{
char t = *a;
*a = *b;
*b = t;
}
//反转字符串
void reverse(char *begin,char *end)
{
int i;
for(i = 0;i <= (end - begin + 1) / 2;i++){
swap(begin + i,end - i);
}
}
void next_permutation(char *str)
{
int len = strlen(str);
int i = len - 2;
while(i >= 0 && str[i] >= str[i + 1]){
i--;
}
if(i == -1){
return;
}
//i之后的字符串已达最大排列
int j = len - 1;
while(str[j] <= str[i]){
j--;
}
//j为从后数第一个str[j]大于str[i]的位置
swap(&str[i],&str[j]);
reverse(str + i + 1,str + len - 1);
}
//正好相反
void prev_permutation(char *str)
{
int len = strlen(str);
int i = len - 2;
while(i >= 0 && str[i] <= str[i + 1]){
i--;
}
if(i == -1){
return;
}
int j = len - 1;
while(str[j] >= str[i]){
j--;
}
swap(&str[i],&str[j]);
reverse(str + i + 1,str + len - 1);
}
void random_shuffle(char *begin,char *end)
{
if(begin == end){
return;
}
char *ptr;
for(ptr = begin + 1;ptr != end;ptr++){
swap(ptr,begin + rand() % (ptr - begin + 1));
}
}