突然想到一个问题,对于给定的几个数怎样用程序把所有的数的排列全部输出呢
查了一下运用的思想是这样的
其实这个和深度优先搜索很像
把数组分成两个部分下标0~s为排好的,s~e为没有排的
对数的操作从s开始
1 void sort(vector<int> &nums,int s,int e){ 2 for(int i = s ; i<e ;++i){ 3 swap(nums,s,i); 4 sort(nums,s+1,e); } 7 }
对于上图的同一列,先s和s交换(相等,实质没有,但是不能省略,它仅代表当前这一层不交换位置),然后s和s+1交..........依次往后
然而每交换一次都会进入下一层,sort(nums,s+1,e)
那么递归的出口就是s和e相等
void sort(vector<int> &nums,int s,int e){ if(s<e) for(int i = s ; i<e ;++i){ swap(nums,s,i); sort(nums,s+1,e); } }
那对如果打印出来呢,在每一个分支到达最深时进行打印
void sort(vector<int> &nums,int s,int e){ if(s==e){ for(int i =0;i<nums.size();++i){ cout<<nums[i]<<" "; } cout<<endl; }else{ for(int i = s ; i<e ;++i){ swap(nums,s,i); sort(nums,s+1,e); } } }
那么每一支到达最深时顺序都被打乱了,别的分支怎么办呢,那就要在回溯的时候把之前交换的数交换回来
void sort(vector<int> &nums,int s,int e){ if(s==e){ for(int i =0;i<nums.size();++i){ cout<<nums[i]<<" "; } cout<<endl; }else{ for(int i = s ; i<e ;++i){ swap(nums,s,i); sort(nums,s+1,e); swap(nums,s,i); } } }
每当递归退出一层的时候都会把之前换的再交换一次,相当于换了回来
参考:http://blog.csdn.net/jfcat/article/details/8785865
时间: 2024-11-05 20:37:23