排列组合生成算法C++实现之邻位互换法
排列组合生成算法C++ ,排列组合生成算法C++实现之邻位互换法
#include<iostream>
#include<vector>
using namespace std;
/*
* 邻位互换法
* 1:找出处于活动状态的元素
* 2:找出处于活动状态的最大值
* 3:用数组初始化出Element类型
* 4:重复以上过程直到没有处于活动状态的元素
*/
int total = 0;
struct Element{
int data; // 整数数值
int direction; //箭头方向 ,0表示向左,1表示向右
};
//找出处于活动状态的元素
//vec存储处于活动状态的元素
bool FindActive(Element array[],int length,vector<int>& vec)
{
vec.clear();
for(int i = 0;i < length;i++)
{
if(array[i].direction == 0 && (i-1 >= 0)&& array[i].data > array[i-1].data )
{
vec.push_back(i);
}
else if (array[i].direction == 1 && (i+1 < length)&& array[i].data > array[i+1].data)
{
vec.push_back(i);
}
}
if (vec.size() != 0)
{
return true;
}
return false;
}
//找出处于活动状态的最大值
int FindBiggestActive(Element array[],int length,vector<int>& vec,int &biggestNum)
{
if (vec.size()==0)
{
return -1;
}
int biggest = vec[0];
for (int i = 0; i < vec.size();i++)
{
if(array[vec[i]].data > array[biggest].data )
{
biggest = vec[i];
}
}
biggestNum = array[biggest].data ;
return biggest;
}
void SwapE( Element array[],int i ,int j)
{
Element temp = {0,0};
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
//交换最大活动状态值与其相邻的元素(箭头方向)
void Swap(Element array[],int length,int biggest)
{
int near;
if(array[biggest].direction == 0)
{
near = biggest - 1;
}
else{
near = biggest + 1;
}
if (near < 0 || near > length)
{
return ;
}
SwapE(array,near,biggest);
}
//改变比活动状态最大值还要打的元素的箭头方向
void ChangeDirection(Element array[],int length,int biggestNum)
{
for (int i = 0 ; i < length ; i++)
{
if(array[i].data > biggestNum)
{
array[i].direction = !array[i].direction;
}
}
}
//用数组初始化出Element类型
void InitElement(int data[],Element* elem,int length)
{
for (int i = 0; i < length ; i++)
{
elem->data = data[i];
elem->direction = 0;
elem++;
}
}
//打印出元素值
void printElement(Element array[],int length)
{
for (int i = 0 ; i < length ; i++)
{
cout << array[i].data << " ";
}
cout << "number : " << ++total << endl;
cout << endl;
}
//以下这3个函数都是为了实现快速排序
void swapA(int A[],int i, int j);
int partition(int A[],int p,int r);
void quicksort(int A[],int p,int r);
//生成Element array的全排列
bool permutation(Element array[],int length,vector<int>& vec)
{
if (!FindActive(array,length,vec))
{
return false;
}
int biggestNUM;
int biggest = FindBiggestActive(array,length,vec,biggestNUM);
Swap(array,length,biggest);
ChangeDirection(array,len
你可能喜欢
- 排列算法
- 排列组合算法
- 组合数学
- 高中排列组合
- 排列组合问题
- 高中三角函数公式总表
- 高考数学椭圆
- 全排列算法解析(完整版)16页
- java 全排列算法集锦6页
- 排列组合生成算法41页
- 排列算法2页
- 全排列生成算法的分析5页
- 全排列算法11页
- 组合数学总习题41页
- 组合数学讲义214页
- 组合数学讲义112页
- 组合数学试题卷一套5页
- 竞赛组合数学(6)-鸽笼原理1页
- 竞赛组合数学(5)-算两次1页
- 高中数学课件-排列组合和二项式定理35页
- 高中数学 排列组合和概率 人教版全部教案35页
- 高中数学轻松搞定排列组合难题二十一种方法-------10页
- 高中数学排列组合问题的几种基本方法15页
- 【智博教育原创专题】排列组合的常见题型及其解法大全(包含高中所有的题型)17页
- 高中数学第十章-排列组合二项定理8页


