码迷,mamicode.com
首页 > 其他好文 > 详细

下一次最近排列

时间:2014-08-05 10:48:39      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   for   2014   ar   

对序列 {a, b, c},每一个元素都比后面的小,按照字典序列,固定a之后,a比bc都小,c比b大,它的下一个序列即为{a, c, b},而{a, c, b}的上一个序列即为{a, b, c},同理可以推出所有的六个序列为:{a, b, c}、{a, c, b}、{b, a, c}、{b, c, a}、{c, a, b}、{c, b, a},其中{a, b, c}没有上一个元素,{c, b, a}没有下一个元素。

代码如下:

 

void swap(int *a, int *b)
{
    int c = *a;
    *a = *b;
    *b = c;
}
void reverse(int *array, int begin, int end)
{
    int i, j;
    for (i = begin, j = end; i < j; i++, j--)
    {
        swap(&array[i], &array[j]);
    }
}

int next_permutation(int *array, int begin, int end)
{
    if (array == NULL || begin >= end)
    {
        return 0;
    }
    int i, j, k;
    for (j = end, i = end - 1; i >= begin && j > begin; j--, i--)
    {
        if (array[i] < array[j])
        {
            break;
        }
    }
    if (j == 0 && i == -1)
    {
        return 0;
    }

    for (k = end; k >= j; k--)
    {
        if (array[k] > array[i])
        {
            break;
        }
    }
    swap(&array[i], &array[k]);
    reverse(array, i + 1, end);    
    return 1;
}

int main(void)
{
    int array[4] = {1, 2, 3, 4};
    int begin = 0, end = 3;
    do
    {
        int i;
        for (i = 0; i <= end; i++)
        {
            cout << array[i] << ", ";
        }
        cout << endl;
    }while (next_permutation(array, begin, end));
    getchar();
    return 0;
}

 

运行结果:

bubuko.com,布布扣

下一次最近排列,布布扣,bubuko.com

下一次最近排列

标签:style   blog   http   color   io   for   2014   ar   

原文地址:http://www.cnblogs.com/liuzhijiang123/p/3891499.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!