我的思路是加n,每次加1代表着从右向左,第一个比右边大的数字x增大一点点,也就是x变为他的右边最小的那个数,之后x右边的数正序排序,就是加1,这样循环n次就行了
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int arr[10000] = { 0 };
int add = 0;
int temp[2] = { 50000,50000 }; //左是arr[x],右是具体的值
int cmp(const void* a , const void* b) {
return *(int*)a - *(int*)b;
}
int main(){
int n = 0;
int now = 0;
scanf("%d%d", &n,&add);
for (int i = 0; i < n; i++){
scanf("%d", arr + i);
}
while (add) {
temp[1] = 50000;
for (int i = n-1; i > 0; i--) {
if (arr[i] <= arr[i-1])
continue;
else {
now = i - 1;
int a = 0;
add--;
for (int j = n - 1; j > i - 1; j--) {
if (arr[j] > arr[i - 1] && arr[j] < temp[1]) {
temp[0] = j;
temp[1] = arr[j];
}
}
a = arr[temp[0]];
arr[temp[0]] = arr[now];
arr[now] = a;
qsort(arr + now + 1, n - now-1, sizeof(int), cmp);
break;
}
}
}
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}