1. 程式人生 > >貝格爾編排法之C++版

貝格爾編排法之C++版

輪轉的步驟與之前的java程式碼不同,相對之前的更高效一些。

// 
#include <iostream>
#include<vector>
using namespace std;
void display(vector<int> arrays,int len){
	for(int i = 0;i<len/2;i++)
		cout<<arrays[i]<<"....."<<arrays[len-i-1]<<endl;
}
int reset(vector<int> &arrays,int flag,int len){
	if(flag==0)
		flag = len -1;
	else
		flag = 0;
	int temp = arrays[len -1];
	arrays[len-1] = arrays[0];
	arrays[0] = temp;
	return flag;
}
void moveByWalk(vector<int> &arrays,int walk,int flag,int len){
	int begin = len-flag-1;//begin為首次移動的位置,即flag對應的另外一個位置;
	int index = begin;
	int temp=0,lasttemp = arrays[index];
	int mod = len-1;//空白位置不計入
	for(int i=0;i<len-2;i++){
		int nextpos = (index+walk)%mod;
		temp = arrays[nextpos];
		arrays[nextpos]= lasttemp;
		index = nextpos;
		lasttemp = temp;
	}
	//當flag=0時,最後一次賦值會賦給arrays[0],因為對len-1取餘的原因,所以要單獨賦值
	arrays[begin] = lasttemp;
}
void compete(vector<int> arrays){
	int len = arrays.size();
	if(len &0x1 != 0){
		arrays.push_back(0);
		len++;
	}
	int flag =len-1;
	int walk = len/2 -1;
	int max = len-1;
	for(int i =0;i <max;i++){
		if(i>0){
			flag = reset(arrays,flag,len);
			moveByWalk(arrays,walk,flag,len);
		}
		cout<<"第"<<i+1<<"輪:"<<endl;
		display(arrays,len);
	
	}

}
int main () {
	int num = 7;
	vector<int> arrays;
	for(int i=0;i<num;i++){
		arrays.push_back(i+1);
	}
	compete(arrays);
	
}