在c++ 中如何对数组中的元素进行全排列?
发布网友
发布时间:2022-04-06 11:23
我来回答
共1个回答
热心网友
时间:2022-04-06 12:52
用标准库algorithm中的next_permutation, 或prev_permutation:
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
float fArray[] = {1.1, 2.2, 3.3, 4.4, 5.5};
float *Beg = fArray;
float *End = fArray + sizeof fArray / sizeof fArray[0];
do{
copy(Beg, End, ostream_iterator<float>(cout, " "));
cout << endl;
}while(next_permutation(Beg, End));
}
算法你去翻翻STL的源码不就可以了,而且这样的算法网上一搜遍地都是,这是我以前搜集的一个算法:
#include <iostream>
#include <algorithm>
template <class T>
void Print(T* tArray, int iSize)
{
for(int i = 0; i < iSize; ++i)
std::cout << tArray[i] << ' ';
std::cout << std::endl;
}
template <class T>
void Permutation(T* tArray, int iSize)
{
int* iTag = new int[iSize + 1];
for(int i = 0; i < iSize; ++i)
iTag[i] = iSize - i;
Print(tArray, iSize);
for(int i = iSize - 1; i > 0; )
{
--iTag[i];
--i;
int j = iSize - 1;
do
{
std::swap(tArray[j--], tArray[i++]);
}while(j > i);
Print(tArray, iSize);
i = iSize - 1;
for(; iTag[i] == 0; --i)
iTag[i] = iSize - i;
}
delete [] iTag;
}
int main()
{
int a[] = {1, 2, 3, 4};
Permutation(a, 4);
float b[] = {2.2, 4.4, 3.3};
Permutation(b, 3);
char c[] = "WIN";
Permutation(c, 3);
}
C语言怎么实现有重复元素的全排列?
从字符串第一位idx=0开始,每次递归都从s[idx]之后选择一个字符与s[idx]交换 因为可能有重复字符,可使用哈希数组标记当前循环每个字符是否被选择 因为字符范围不超过ASCII码,所以使用128空间的数组足够用来标记了 选择好当前字符s[i]并与s[idx]交换之后,递归调用继续排列下一位s[idx+1]注意这里要...
c语言中,如何输出一个数组的全排列!如a[3]={1,2,3} 要求输出1 2 3,1...
for(i = 0; i < N; i++)printf(' %c ',a[i]);printf('\n');} void swap(int i, int offset){ int temp;temp = a[offset];a[offset] = a[i];a[i] = temp;}
c语言全排列
1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。由于一个数的全排列就是其本身,从而得到以上结果。2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。即以3开头的和4...
...9的9个数放入这个数组,也求出所有可能。c语言实现。说一下思路或者...
如果我求得固定第10位后的排列,固定第9位后的排列就可以求出,固定第10位有1种可能,可以循环求得。这很明显是递归的算法。include <stdio.h> int n,a[10]; /*a[1],a[2],…,a[n]构成n个数的一个排列*/ long count=0; /*变量count记录不同排列的个数,这里用于控制换行*/ void pe...
求全排列的问题。abcde五个字母,列出所有的排列。这个应该怎么实现?
//这个仔细想了下,确实有点绕。用的是土办法。我已经测试过,程序执行没问题。代码你直接拷贝到main函数中执行。//定义数组 char [] char_arr = {'a','b','c','d','e'};for(int i=0;i<char_arr.length;i++){ for(int j=0;j<char_arr.length;j++){ if(j == i){ continu...
数学排列组合的算法、如图两个、有什么区别、求算法谢谢
3. 输出排列。组合算法:1. 从数组的第数开始往后取,取到指定数量的数时输出。2. 如果未取到指定数量的数,则从当前位置的下数开始递归取数,以此类推。3. 输出组合。区别:全排列算法会将所有的元素进行排列,包括元素的顺序;组合算法只是从一组数中取出一定数量的数,不考虑它们的顺序。
c# 如何将几个数字进行搭配相加,得出全排列组合
static int[] number;static int[] result;/// /// 应用程序的主入口点。/// [STAThread]static void Main(string[] args){ number = new int[] {2,3,4,6};result = new int[number.Length];Backtrace(0);System.Console.Read();} static void Backtrace(int i){ if (i >= num...
全排列Heap算法全排列
函数perm用于实现Heap算法全排列,参数list为要排列的字符串,n表示字符串长度。在perm函数中,首先定义变量i为n,使用while循环输出字符串c。然后定义变量k,tmp,i为n,count数组用于记录当前排列位置的元素移动次数。使用do-while循环,当count[i-1]小于i时,执行内部if条件判断。内部if条件判断根据i的...
4个元素的全排列共有多少种
4个元素的全排列共有24种,栈要求符合后进先出,按此衡量排除后即得:1234√,1243√,1324√,1342√,1423×,1432√,2134√,2143√,2314√ ,2341√,2413×,2431√,3124×,3142×,3214√,3241√,3412×,3421√,4123×,4132×,4213×,4231×,4312×,4321√。14种可能,10种不...
谁能解释一下用递归做的排列算法的详细步骤?参考王晓东的《计算机算 ...
快速排序:先选最开始的元素为枢轴,然后分别从两头中的一头开始与枢轴比较。后面的应该大于枢轴,前面的应该小于枢轴,不然则交换(前面与后面),最后确定下来的位置(前后重合)就是枢轴的位置。这样一来原序列就一分为二。不断递归,再一分为二,最后直到被分为的两端中有一个元素单独的时候就结束...