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

数的排列问题

时间:2016-06-13 01:02:24      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

突然想到一个问题,对于给定的几个数怎样用程序把所有的数的排列全部输出呢

查了一下运用的思想是这样的

技术分享

其实这个和深度优先搜索很像

把数组分成两个部分下标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

数的排列问题

标签:

原文地址:http://www.cnblogs.com/mmmmar/p/5579118.html

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