#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5;
int n, k, a[N];
int main()
{
cin >> n >> k;
for(int i = 0; i < n; i++) cin >> a[i];
for(int i = 0; i < n;)
{
int t = min(i + k + 1, n); // 計算操作區間 [i + 1, t) 的右端點
auto it = min_element(a + i, a + t); // 找到操作區間中的最小值
if(it - a > i) // 如果最小值不在區間起點,執行交換操作
for(int j = it - a; j > i; j--) swap(a[j], a[j-1]);
i++;
}
for(int i = 0; i < n; i++) cout << a[i] << " ";
cout << endl;
return 0;
}
該代碼采用貪心算法,每次從當前位置開始向右選取區間 [i+1, t)進行操作,其中右端點 t的計算方式為 t=\min(i+k+1,n);然後在該區間中找到最小值,並且如果最小值不在區間起點,那麽就依次向左與前面的數進行交換,直到最小值位置為止。通過這樣的方式可以使得字典序盡量小。