没想到23年408就考了置换-选择排序…
代码
代码参考严蔚敏老师的《数据结构》一书。
#include<bits/stdc++.h>
using namespace std;
struct entry {
int key;
int run;
entry() = default;
};
vector<int> a;
vector<int> run;
int N, M;
int rc, rmax;
int cur = 0;
vector<int> ls;
vector<entry> wa;
void select_minmax(int s) {
for(int t = (M + s) / 2, p = ls[t]; t > 0; t /= 2, p=ls[t]) {
if(wa[p].run < wa[s].run
|| (wa[p].run == wa[s].run && wa[p].key < wa[s].key)) {
swap(s, ls[t]);
}
}
ls[0] = s;
}
void init_ls() {
ls.resize(M);
wa.resize(M);
for(int i = 0; i < M; ++i) {
wa[i].run = wa[i].key = ls[i] = 0;
}
for(int i = M - 1; i >= 0; --i) {
wa[i].run = 1;
wa[i].key = a[i];
select_minmax(i);
}
cur = M;
}
void get_run() {
run.clear();
while(wa[ls[0]].run == rc) {
auto q = ls[0];
auto minmax_val = wa[q].key;
run.push_back(wa[q].key);
if(cur == N) {
wa[q].run = rmax + 1;
wa[q].key = INT_MAX;
} else {
wa[q].key = a[cur++];
if(wa[q].key > minmax_val)
wa[q].run = rc;
else {
wa[q].run = rc + 1;
rmax = rc + 1;
}
}
select_minmax(q);
}
}
void replacement_selection() {
init_ls();
rc = rmax = 1;
while(rc <= rmax) {
get_run();
int len = run.size();
for(int i = 0; i < len; ++i) {
printf("%d" , run[i]);
if(i != len - 1)
printf(" ");
}
printf("\n");
rc = wa[ls[0]].run;
}
}
int main() {
cin >> N >> M;
a.resize(N);
for(int i = 0; i < N; ++i) {
cin >> a[i];
}
replacement_selection();
}