全排列算法c++实现

来源:互联网 发布:佛教的心知 编辑:程序博客网 时间:2024/06/05 02:41


#include <iostream>using namespace std;//step1: 找出最大活动整数m以及下标int fun(int a[], int b[], int n){int max = -1;int value = 0;for (int i = 0; i<n; i++){if ((b[i] == 0) && (i != n - 1) && (a[i]>a[i + 1]) && (a[i]>value)){max = i;value = a[i];}if ((b[i] == 1) && (i != 0) && (a[i]>a[i - 1]) && (a[i]>value)){max = i;value = a[i];}}return max;}void swap(int a[], int b[], int index, int n){//step2:交换m和其箭头所知向的与其相邻的整数int m = (b[index] == 1) ? (index - 1) : (index + 1);//交换数值int temp1 = a[m];a[m] = a[index];a[index] = temp1;//交换方向int temp2 = b[m];b[m] = b[index];b[index] = temp2;//step3:交换所有满足p>m的整数p的方向for (int i = 0; i<n; i++){if (a[i]>a[m]){b[i] = 1 - b[i];}}}//输出函数void display(int a[], int n){for (int i = 0; i<n; i++){cout << a[i] << "";}cout << endl;}int main(){int n;cin >> n;int*p = (int *)malloc(sizeof(int)*n);int*q = (int *)malloc(sizeof(int)*n);for (int i = 0; i<n; i++){*(p + i) = i + 1;*(q + i) = 1;}display(p, n);int count = 1;while (fun(p, q, n) != -1){int index = fun(p, q, n);swap(p, q, index, n);display(p, n);count++;}cout << "TotalNum: " << count << endl;free(p);free(q);system("pause");return 0;}


#include<iostream>using namespace std;int FindMaxIndex(int a[], int n){int max = -1;for (int i = 0; i<n - 1; i++){if ((a[i]<a[i + 1]) && (i>max)){max = i;}}return max;}int NewValueIndex(int a[], int n, int index){int i;for (i = n - 1; i>index; i--){if (a[i]>a[index])break;}return i;}void swap(int a[], int index1, int index2){int temp = a[index1];a[index1] = a[index2];a[index2] = temp;}void resort(int a[], int index, int n){int r = index + 1;int s = n - 1;while (r<s){int temp = a[r];a[r] = a[s];a[s] = temp;r++;s--;}}void display(int a[], int n){for (int i = 0; i<n; i++){cout << a[i] << "";}cout << endl;}int main(){int n;cin >> n;int*p = (int *)malloc(sizeof(int)*n);for (int i = 0; i<n; i++){*(p + i) = i + 1;}display(p, n);int count = 1;while (FindMaxIndex(p, n) != -1){int j = FindMaxIndex(p, n);int k = NewValueIndex(p, n, j);swap(p, j, k);resort(p, j, n);display(p, n);count++;}cout << "TotalNum:" << count << endl;free(p);system("pause");return 0;}


0 0
原创粉丝点击