输入:abc 输出:abc acb bac bca cab cba
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void mySwap(char *a,char *b)
{
char temp
temp = *a
*a = *b
*b = temp
}
void PaiLie(char *list,int begin,int end)
{
int i
if(list == NULL)
return
if(begin == end)
{
printf("%s ",list)
printf("\n")
}else{
for(i = begin i<=end i++)
{
mySwap(&list[i],&list[begin])
PaiLie(list,begin+1,end)
mySwap(&list[i],&list[begin])
}
}
}
void main()
{
char list[] = "abc"
char out [4]
PaiLie(list,0,2)
//ZuHe(list,out,3,0,0)
}
如果有重复,去掉重复的,然后满足一些特定的要求(如:第3个位置不可以是4,3和5不可以相邻)
Java实现。
此方法需要输入数字从小到大排列,若不是只需在排列之前预处理一下即可。
关键是compareTo方法
[java] view plain copy
package dataStruct
import java.util.LinkedList
import java.util.List
public class PaiLie {
private static List<String>result = new LinkedList<String>()
private static String lastResult = ""
public static void main(String[] args) {
String s = "1223"
char[] c = s.toCharArray()
paiLie(c, 0, c.length - 1)
for (int i = 0i <result.size()i++)
System.out.println(result.get(i))
}
public static boolean validator(String s) {
if (s.compareTo(lastResult) <= 0) //去重复的关键
return false
if (s.charAt(2) == '4')
return false
if (s.indexOf("35") >= 0)
return false
if (s.indexOf("53") >= 0)
return false
return true
}
public static void paiLie(char[] c, int begin, int end) {
if (begin == end) {
String s = new String(c)
if (validator(s)) {
lastResult = s
result.add(s)
}
}
for (int i = begini <= endi++) {
swap(c, begin, i)
paiLie(c, begin + 1, end)
swap(c, begin, i)
}
}
public static void swap(char[] c, int i, int j) {
char temp
temp = c[i]
c[i] = c[j]
c[j] = temp
}
}
C语言中,汉字是按照字符串来处理的,一个汉字占用2个字节,汉字的排序就是按照汉字的编码进行排序(不是拼音),而是半个汉字的ASCII码进行排序的。所以在输出汉字的时候,如果按照字节输出,而不按照字符串输出的话,就会出现乱码。
具体汉字的编码,就不是那么容易的了。编码一般以0x开头,表示是用一个十六进制数表示的。
void main(){
char word[100] = "bca"//不能是常量数据,必须用数组,常量字符串不让修改!
strSort(word)
puts(word)
}