关于全排列算法思路的,代码中间一段如何都看不懂,全排列的具体规律是怎样的?求指教

关于全排列算法思路的,代码中间一段怎么都看不懂,全排列的具体规律是怎样的?求指教
void allRangle(int arr[], int m, int nLen)
{
if (m == nLen)
{
for (int i = 0; i < nLen; i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
else
{
for (int i = m; i < nLen; i++)
{
swap(arr[m], arr[i]);
allRangle(arr, m+1, nLen);
swap(arr[m], arr[i]);
}
}
}
全排列 算法 思路

------解决方案--------------------
大概思想就是对每一个位置, 依次选择对应的数来放, 输出每一种放置方法.

首先, 开始的时候 m = 0, 对应位置 0. 通过:

 for (int i = m; i < nLen; i++)
 {
   swap(arr[m], arr[i]);

这个循环, 从 0 到结束的每一个数, 依次尝试把它放到位置 m = 0 上.

然后 m = 1 选择第二个位置的数, 从第二个开始到最后的数依次尝试放到第 2 个位置上.
然后 m = 2 选择地三个位置的数.
...
到 m = nLen - 1, 所有的位置都选好数了.
下一次递归 m = nLen 进行输出.

------解决方案--------------------
求全排列的真正迭代算法比较复杂:
1:将序列D从小到大排序,此为第一个排列
2:从后向前找到第一个比其后紧邻元素小的元素D[I]
    2.1存在I:从后向前找到第一个比元素D[I]大的元素D[J],这一步必然成功。
             2.1.1 交换D[I]与D[J]
             2.2.2 将从D[I+1]到表尾的数据逆转,此为下一个排列
    2.2不存在I:排序迭代完毕,退出
3:回到第2步。

递归算法要简单一些:
1:判断size==1
  1.1 真:全排列只有一个{D[0]}
  1.2 假:
    1.2.1:I从0到size-1循环:
       1.2.1.1:交换D[I],D[0]
       1.2.1.2:求D[1]到队尾的全排列,放在D[0]后面
------解决方案--------------------
大致分析了下,不知道能否看到
假如m=5,nLen=10
5-5(交换5,5)
  6-6
  
    7-7//i=7,m=7