1.字典排序算法
原理:数组1,2,3 将大的值向前移动,小的值向后移动成 3,2,1 排列结束
有结束标识
方法1:排列下标法,不需要执行排列前手动字典排序
static void pailie(char[] a, int count)
{
int i, j, temp;
//初始化下标队列
int[] p = new int[a.Length];
for (i = 0; i < p.Length; i++)
{
p[i] = i;
}
while (true)
{
//输出显示结果
StringBuilder builder = new StringBuilder(50);
for (int k = 0; k < a.Length; k++)
builder.Append(a[p[k]]);
Console.WriteLine(builder.ToString());
//从后向前查找,看有没有后面的数待遇前面的数的情况,若有则暂停在后一个数的位置
for (i = count - 1; i > 0 && p[i] < p[i - 1]; i--) ;
//若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回
if (i == 0)
break;
//从后查看到i,查找大于p[i-1] 的最小值,记录j
for (j = count - 1; j > i && p[j] < p[i - 1]; j--) ;
//交换 p[i-1]和 p[j]
temp = p[i - 1]; p[i - 1] = p[j]; p[j] = temp;
//倒置 a[i]到a[n-1]
for (i = i, j = count - 1; i < j; i++, j--)
{
temp = p[i]; p[i] = p[j]; p[j] = temp;
}
}
}
方法2:排列内容法,排列前需要手动字典排序
static void pailie(char[] a, int count)
{
int i, j;
while (true)
{
//输出显示结果
StringBuilder builder = new StringBuilder(50);
for (int k = 0; k < a.Length; k++)
builder.Append(a[k]);
Console.WriteLine(builder.ToString());
//从后向前查找,看有没有后面的数待遇前面的数的情况,若有则暂停在后一个数的位置
for (i = count - 1; i > 0 && a[i] < a[i - 1]; i--) ;
//若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回
if (i == 0)
break;
//从后查看到i,查找大于a[i-1] 的最小值,记录j
for (j = count - 1; j > i && a[j] < a[i - 1]; j--) ;
//交换 a[i-1]和 a[j]
swap(a, i - 1, j);
//倒置 a[i]到a[n-1]
for (i = i, j = count - 1; i < j; i++, j--)
{
swap(a, i, j);
}
}
}
static void swap(char[] source, int i, int j)
{
char temp = source[i];
source[i] = source[j];
source[j] = temp;
}