一组数据的全排列——分治法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YL970302/article/details/85857553

一、思想——全排列

  依次将待排列的数组的后n-1个元素分别与与第一个元素交换,则每次递归处理的都是后n-1个元素的全排列。当数组元素仅有一个e为此递归算法的出口。

   也就是说交换的步骤是这样的:

   (1)第一个数与第一个数交换,然后对第一个数后面的所有数进行排列。当对后面的数进行排列的时候,将这组数据中的第一个数与第一个数交换.....这样一直交换下去,当只剩一个数据的时候输出,即第一次得到的结果就是原数组

  (2)整个数组中的第二个数与第一个数进行交换,对交换后得到的数组中从第二个数开始再进行第(1)步

  (3)这次就是第三个数与第一个数交换....

  (4)依次这样交换下去,但是要注意的是在每次交换后得出一组排序结构之后,都要再将数据交换回去,变成原数组,再进行下一轮的交换

二、图形表示 :(如果上面的解释看不懂,就直接看图),图也是根据自己的理解画的,有什么问题请记得留言哈

第一个数与第一个数交换

第二个数据与第一个数据进行交换

第三个数与第一个数进行交换

三、代码展示:

template<class Type>
void  perm(Type list[], int k, int m)  // m是数组最后一个元素的下标
{
	if(k == m)
	{
		for(int i=0; i<=m; i++)
		{
			cout<<list[i]<<" ";
		}
		cout<<endl;
	}
	else
	{
		for(int i=k; i<=m; i++)
		{
			swap(list[k],list[i]);
			int j = k+1;
			perm(list, j, m);
			swap(list[k],list[i]);
		}
	}
}

   请注意,当我们每次将后面的数与第一个数交换后一定要记得将这组数据再交换变回原来的样子,每次后面的数与第一个数在交换的时候都是在原数据的基础上交换的

猜你喜欢

转载自blog.csdn.net/YL970302/article/details/85857553
今日推荐