全排列复习
今天写了蓝桥杯的题目九数组分数发现考了全排列交换法,还好还记得,马上写了出来。
对于全排列公式 n! ,因为第一个位置有 n 种选择,第二个位置有 n-1 种选择,第 n 个位置有 1 种选择,相乘即得答案。
假如要对 1 2 3 4 5 进行全排列,第一个位置有5种选择(1,2,3,4,5),第二个位置有4种选择(减去第一个数剩下每一个数都可以来尝试坐一下这个位置),第三个位置有3种选择……对于第一个位置,1,2,3,4,5都要来坐一坐,所以1坐完就和2,交换一下位置,让2来坐一下第一的位置,2坐完以后,再回溯和1换回来,1再和3交换,让3来坐一下宝座,3坐完以后……所以第一个数字要和包括他本身以内的所有数字交换一遍,为什么包括他本身?因为他本身在那里就作为一种排列。
当第一个位置被抢了以后,剩下的四个数字就来抢第二个宝座,同样,这四个宝座每个人都轮着来坐一回;一样的过程,确认第三第四个位置……直到最后一个位置。
当最后一个位置都被占满了,一种全排列就形成了,第一种全排列是 1,2,3,4,5.
5占了最后一个位置,由于他后面没有数字跟他交换了,回溯到第四个位置,4占了第四个位置,此时5也在等待交换位置,他可以和5交换位置,大家都尝试了新的位置,又一种全排列产生;4到了最后的位置也没人和他交换了,和5换回位置;回溯到3,3这个位置4,5都要来尝试一波,所以3先和4交换,4已经占用了第三个位置,至于后面两个位置就随便交给3和5折腾了;接下来就是不断的交换,直到完毕。
#include<stdio.h> int arr[]={1,2,3,4,5}; void swap(int a,int b) //a,b表示数组下标 { int temp; temp=arr[a]; arr[a]=arr[b]; arr[b]=temp; } void Fullsort(int n) { if(n==5) //输出 { int i; for(i=0;i<=4;i++) printf("%d ",arr[i]); printf("\n"); return; } int i; for(i=n;i<=4;i++) //第n个位置的数分别与后面4-n个位置的数(包含本身)交换 { swap(n,i); Fullsort(n+1); swap(n,i); //换回来 } } int main() { Fullsort(0); return 0; }