数组2n [a1, a2, ...an, b1, b2, ...bn] 在时间O(n),空间 O(1) 条件下,生成[b1,a1,b2,a2....an,bn]
对于3^k-1 < 2n < 3^(k+1) -1 的情况, 取 2m = 3^k -1 递归求解:
对于2m = 3^k -1 的perfect shuffle
public class PerfectShuffleJai04 {
static public void shuffle(char[] unshuffled){
shuffle(unshuffled, 0, unshuffled.length);
}
static void shuffle(char[] unshuffled, int start, int len){
if( len >= 2){
int n = len / 2;
int k = getK(n);
int m = (int) ((Math.pow(3, k) - 1) / 2);
if (m < n && n > 0) {
shiftRight(unshuffled, start + m, n, m);
cycle(unshuffled, start, m * 2);
//Recursive
shuffle(unshuffled, start + m * 2, len - m * 2 );
} else if( m == n) {
cycle(unshuffled, start, len);
}
}
}
//Get k, 3^k <= (n * 2 +1) < 3^(k+1)
static int getK(int n){
int k = 0;
for (;; k++) {
if (Math.pow(3, k) <= n * 2 + 1 && Math.pow(3, k + 1) > n * 2 + 1) {
break;
}
}
return k;
}
//Cycle header
static void cycle(char[] c, int start, int len){
int k = getK(len/2);
int mod = (int) Math.pow(3, k);
char tmp = ' ';
for(int i = 0; i < k; i++ ){
int cycleHead = start + (int) Math.pow(3,i) - 1;
int current = cycleHead;
int next = 0;
do{
next = (current - start + 1) * 2 % mod + start - 1;
tmp = c[next];
c[next] = c[cycleHead];
c[cycleHead] = tmp;
current = next;
}while(current != cycleHead);
}
}
//Shift Right
static public void shiftRight(char[] c, int start, int len, int m){
m = m % len;
if (m < 0){
m = m + len;
}
reverse(c, start + len - m , start + len - 1);
reverse(c, start, start + len - m - 1 );
reverse(c, start, start + len - 1);
}
static void reverse(char[] c, int m, int n){
char t;
for (; m < n; m++, n--){
t = c[m];
c[m] = c[n];
c[n] = t;
}
}
static public void printArray(char[] arr){
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void main(String[] args){
String s = "12345678ABCDEFGH";
char[] a = s.toCharArray();
printArray(a);
shuffle(a);
printArray(a);
}
}