题目描述
有 n个同学拍成一排,从左到右依次编号为 1 ~ n 。 现在给出了这个 n 位同学的身高,但是并不是按照高矮排序的。
现在这些同学需要按照身高从矮到高的顺序重新排列,矮的同学在左边,高的同学在右边。
如果两个同学身高相同,那么这两个同学的相对顺序不应该发生变化
。 请你输出排序以后从左到右同学的编号。
输入
输入一个行一个整数 n(1≤n≤1000)。 接下来n行输入n 个整数,依次表示从左到右的同学的身高,每个同学身高小于等于 300。
输出
一行输出 n 个整数,两个数中间用空格隔开,行末不要有多余空格。 表示重新排列以后从左到右的同学的编号。
样例输入1
5
156 178 145 190 156
样例输出1
3 1 5 2 4
代码
#include <stdio.h>
#include <stdlib.h>
int main () {
struct Stu {
int num;
int height;
};
int n;
scanf("%d", &n);
struct Stu* student;
student = (struct Stu*) calloc(n, sizeof(struct Stu));
for (int i = 0; i < n; i++) {
scanf("%d", &student[i].height);
student[i].num = i + 1;
}
int i, j;
// 选择排序法
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
// 如果两个同学身高相同,那么这两个同学的相对顺序不应该发生变化
if (student[j].height < student[i].height || (student[j].height == student[i].height && student[j].num < student[i].num)) {
struct Stu t;
t = student[i];
student[i] = student[j];
student[j] = t;
}
}
}
for (int i = 0; i < n; i++) {
i < n - 1 ? printf("%d ", student[i].num) : printf("%d", student[i].num);
}
free(student);
return 0;
}