全排列算法(字典排序法)1

来源:互联网 发布:淘宝达人的名字大全集 编辑:程序博客网 时间:2024/06/02 05:14

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;}






0 0
原创粉丝点击