完美洗牌2

既然完美洗牌問題是給定輸入:a1,a2,a3,……aN,b1,b2,b3,……bN,要求輸出:b1,a1,b2,a2,……bN,aN;那麼有無考慮過它的逆問題:即給定b1,a1,b2,a2,……bN,aN,,要求輸出a1,a2,a3,……aN,b1,b2,b3,……bN ?

#include <iostream>
using namespace std;

void printArr(int* arr, int len) {
	for (int i = 0; i < len; ++i) {
		cout << arr[i] << ' ';
	}
	cout << endl;
}

//翻轉字符串時間複雜度O(to - from)
void reverse(int *a, int from, int to) {
	int t;
	for (; from < to; ++from, --to) {
		t = a[from];
		a[from] = a[to];
		a[to] = t;

	}
}

void rotate(int* a, int from, int to) {
	reverse(a, from + 1, to);
	reverse(a, from, to);
}

void leftRotate(int* a, int n) {
	reverse(a, 2, n);
	reverse(a, 1, n);
}

/*
 * 完美洗牌逆向2
 * 0 1 5 2 6 3 7 4 8
 * 0 1 2 6 3 7 4 5 8 第一遍
 * 0 1 2 3 7 4 5 6 8 第二遍
 * ...
 */
void inShuffle(int* a, int n) {
	if (!a || !n) {
		return;
	}

	n -= 2;
	int end = n / 2;
	while (n > end) {
		leftRotate(a + 1, n);
		n--;
		a++;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章