程序员

算法学习-全排列

2017-11-16  本文已影响0人  vincentgemini

核心思想是交换,具体来说,对于一个长度为n的串,要得到其所有排列,我们可以这样做:
1.把当前位上的元素依次与其后的所有元素进行交换;
2.对下一位做相同处理,直到当前位是最后一位为止,输出序列;

需要注意的一点:思想是“交换”,也就是直接对原数据进行修改,那么在交换之后一定还要再换回来,否则原数据就发生变化了,肯定会出错

如果觉得上面的解释还是很难懂的话,那么记住这句话:核心思想就是让你后面的所有人都和你交换一遍(而你是一个指针,从前向后按位移动...)

void swap(int *a, int *b)
{    
    int m;    
    m = *a;    
    *a = *b;    
    *b = m;
} 

void perm(int list[], int k, int m)
{    
    int i;    
    if(k > m)    
    {         
        for(i = 0; i <= m; i++)            
            printf("%d ", list[i]);        
        printf("\n");        
    }    
    else    
    {        
        for(i = k; i <= m; i++)        
        {            
            swap(&list[k], &list[i]);            
            perm(list, k + 1, m);            
            swap(&list[k], &list[i]);        
        }    
    }
} 
上一篇下一篇

猜你喜欢

热点阅读