排序的同时追踪元素下标的变化一般有两种方法:
1、使用结构体数组(每个结构体元素 |包含对应的元素、下标)
2、辅助数组
下面时利用辅助数组来追踪排序时目标元素下标的变化:
原数组交换元素时,辅助数组同时交换(适用于交换类排序)
# define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void insertionSort(int *a, int* b, int n) {
int i, j;
for (i = 2; i < n; i++) {
for (int j = i; j >= 2; j--) {
if (a[j] < a[j - 1]) {
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
temp = b[j - 1];
b[j - 1] = b[j];
b[j] = temp;
}
}
}
}
int main() {
int n, Q;
scanf("%d %d", &n, &Q);
int* a = (int*)malloc((n + 1) * sizeof(int));
int* _a = (int*)malloc((n + 1) * sizeof(int));
int* b = (int*)malloc((n + 1) * sizeof(int));
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
b[i] = 0;
}
while (Q--) {
int op;
scanf("%d", &op);
if (op == 1) {
int x, u;
scanf("%d %d", &x, &u);
a[x] = u;
}
else if (op == 2) {
for (int i = 1; i <= n; i++) {
_a[i] = a[i];
}
int x,i;
scanf("%d", &x);
b[x] = 1;
insertionSort(a, b, n + 1);
//for (int i = 1; i <= n; i++) {
// printf(" %d", a[i]);
//}
//printf("\n");
for (i = 1; i <= n; i++) {
if (b[i] == 1) {
printf("%d\n", i);
break;
}
}
b[i] = 0;
for (int i = 1; i <= n; i++) {
a[i] = _a[i];
}
}
}
free(a);
free(_a);
free(b);
return 0;
}
/*
3 4
3 2 1
2 3
1 3 2
2 2
2 3
1
1
2
*/
也可以同时记录多个元素的交换,只需要修改辅助数组即可。