首先,对于数字1,2,3,4而言,如果我们能求出其下一个排列,那么不断地求其下一个排列,得到的就是全排列,关于怎么求一个排列的下一个排列,见:http://www.cnblogs.com/jeysin/p/8647879.html. 基于这种思路,可以用非递归的方式实现求数字的全排列,以下是具体实现
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 void swap(int &a, int &b) 5 { 6 int tmp=a; 7 a=b; 8 b=tmp; 9 } 10 void reverseArray(vector<int> &nums, int begin, int end) 11 { 12 while(begin<end) 13 { 14 swap(nums[begin], nums[end]); 15 ++begin; 16 --end; 17 } 18 } 19 void printArray(vector<int> &nums) 20 { 21 for(int i=0; i<nums.size(); ++i)cout<<nums[i]<<" "; 22 cout<<endl; 23 } 24 int main() 25 { 26 int n; 27 cin>>n; 28 vector<int> nums(n, 0); 29 for(int i=0; i<n; ++i) 30 { 31 nums[i]=i+1; 32 } 33 printArray(nums); 34 while(true) 35 { 36 int i; 37 for(i=nums.size()-2; i>=0; --i) 38 { 39 if(nums[i]<nums[i+1])break; 40 } 41 if(i==-1)break; 42 int j; 43 for(j=nums.size()-1; j>=0; --j) 44 { 45 if(nums[j]>nums[i])break; 46 } 47 swap(nums[i], nums[j]); 48 reverseArray(nums, i+1, nums.size()-1); 49 printArray(nums); 50 } 51 return 0; 52 }