貝格爾編排法之C++版
阿新 • • 發佈:2019-01-23
輪轉的步驟與之前的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); }