全排列图解:
①:对区间b------c进行数据的全排列,数组当中的每个数据都可以排在首位置,具体操作对数组进行遍历和a进行swap位置交换。
②:当第一个位置确定后,剩余的数据又重新组成了新的全排列,区间从b+1------c。
③:遍历过程中,需要依次把后续数据排在首位,在开始下一个数据排在首位之前,不能破坏原有的数据结构,也就是说需要对上一次的swap交换操作进行还原!
递归程序:
//自定义交换函数swapvoidswap(inta[],inti,intj){inttemp=a;a=a[j];a[j]=temp;}//自定义打印数组函数print_arrayvoidprint_array(inta[],intn){for(inti=0;i=n;i++){couta"";}//一行一输出coutendl;}//核心递归函数perm,给定一个数组,对区间b-c之间的数据进行全排列,需要遍历数组b-c之间的数据voidperm(inta[],intb,intc){//当区间等于1的时候,也就是左右相撞的时候,说明排列完成打印输出这次排列,递归结束,这个作为递归的边界条件if(b==c){print_array(a,c);}else{//遍历整个数组,从开始位置遍历for(inti=b;i=c;i++){//每个数据都可能作为首位数据,实现通过swap调换swap(a,b,i);//每次确定首位数据后,后续数据又重新组成一个从b+1到c之间的全排列perm(a,b+1,c);//下个数据作为首位数据之前,要重新恢复最开始的排列顺序,不能破坏swap(a,b,i);}}}
main函数数据测试:
#includeiostreamusingnamespacestd;intmain(){inta[]={1,2,3};perm(a,0,2);}
重点