算法: 如何将集合中元素任意排序, C实现

来源:百度知道 编辑:UC知道 时间:2024/05/14 12:48:24
注意并不是只要返回一个任意排序的数组, 要求
void my_function(int argu, int* array, int length)
每个argu值对应一个特定的序列array(长度为length)
比如: argu == 1 array[] == 012345
argu == 2 array[] == 312450
只要一个argu对应一个array序列即可,
argu的取值应为length!范围内
length长度最少为36,所以枚举或列大表应该是不行的。
最好有代码,没代码给个思路吧,谢谢。
谢谢回答, 不过递归部分没太看懂, 不懂c++, 不太明白int& b, int& v是什么?每次进入permute,v,t都加1吗?全靠swap可以实现n!个顺序吗?希望能解释得详细一点,谢谢。

需要的信息太多,可以在递归枚举的基础上稍做修改。

#include <iostream>
#include <list>
#include <iterator>

using namespace std;

template <class Elem>
inline void swap(Elem* a, int i, int j) {
Elem temp;
temp = a[i]; a[i] = a[j]; a[j] = temp;
}

void permute(int a[], int n, int t, int u, int& v, int& b) {
if (t == n - 1 && ++v == u) {
for (int i = 0; i < n; i++)
cout << a[i] << "\t";
cout << endl;
b = 0;
} else {
for (int i = t; b && (i < n); i++) {
swap(a, t, i);
permute(a, n, t+1, u, v, b);
swap(a, t, i);
}
}
}

void permute(int a[], int n, int u) {
int v = 0, b = 1;
permute(a, n, 0, u, v, b);
}

int main()
{
const int size = 6;
int a[size] = {0, 1, 2, 3, 4, 5};
for (int i = 0; i < 10; i++) permute(a, size, i);
cout