#include <iostream> #include <algorithm> const int N = 1 << 21; using namespace std; int tab[N]; int t[N]; void merge(int pocz, int sr, int kon) { //cout << "merge: " << pocz << " " << sr << " " << kon <<endl; if (kon - pocz == 1) { swap(tab[pocz], tab[kon]); return; } reverse(tab + pocz, tab + sr); reverse(tab + sr, tab + kon); for(int i = sr; i < kon; i++) { t[i - sr + pocz] = tab[i]; } for(int i = pocz; i < sr; i++) { t[i - pocz + sr] = tab[i]; } for(int i = pocz; i < kon; i++) tab[i] = t[i]; } void mergesort(int pocz, int kon, int b) { //cout << "b: " << b << " " << pocz << " " << kon << endl; if (b == 0) return; int sr; if (pocz<kon) { sr=(pocz+kon)/2; mergesort(pocz, sr, b-1); mergesort(sr+1, kon, b-1); merge(pocz, sr, kon); } } int a, b; int main() { cin >> a >> b; for(int i = 0; i < (1 << (a)); i++) { cin >> tab[i]; } mergesort(0, (1 << (a)), b); for(int i = 0; i < (1 << (a)); i++) { cout << tab[i] << " "; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <iostream> #include <algorithm> const int N = 1 << 21; using namespace std; int tab[N]; int t[N]; void merge(int pocz, int sr, int kon) { //cout << "merge: " << pocz << " " << sr << " " << kon <<endl; if (kon - pocz == 1) { swap(tab[pocz], tab[kon]); return; } reverse(tab + pocz, tab + sr); reverse(tab + sr, tab + kon); for(int i = sr; i < kon; i++) { t[i - sr + pocz] = tab[i]; } for(int i = pocz; i < sr; i++) { t[i - pocz + sr] = tab[i]; } for(int i = pocz; i < kon; i++) tab[i] = t[i]; } void mergesort(int pocz, int kon, int b) { //cout << "b: " << b << " " << pocz << " " << kon << endl; if (b == 0) return; int sr; if (pocz<kon) { sr=(pocz+kon)/2; mergesort(pocz, sr, b-1); mergesort(sr+1, kon, b-1); merge(pocz, sr, kon); } } int a, b; int main() { cin >> a >> b; for(int i = 0; i < (1 << (a)); i++) { cin >> tab[i]; } mergesort(0, (1 << (a)), b); for(int i = 0; i < (1 << (a)); i++) { cout << tab[i] << " "; } } |