题目1167:数组排序
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:3357
解决:1068
-
题目描述:
-
输入一个数组的值,求出各个值从小到大排序后的次序。
-
输入:
-
输入有多组数据。
每组输入的第一个数为数组的长度n(1<=n<=10000),后面的数为数组中的值,以空格分割。
-
输出:
-
各输入的值按从小到大排列的次序(最后一个数字后面没有空格)。
-
样例输入:
-
4 -3 75 12 -3
-
样例输出:
-
1 3 2 1
-
来源:
- 2009年北京航空航天大学计算机研究生机试真题
-
#include<stdio.h> #include<stdlib.h> int cmp(const void *a, const void *b){ return *(int*)a - *(int*)b; } int main(void){ int n; while(~scanf("%d", &n)){ if(n == 1){ printf("1\n"); continue; } int i = 0; int j = 0; int jj = 0; int* ar = (int*)malloc(n * sizeof(int)); int* br = (int*)malloc(n * sizeof(int)); int* rank = (int*)malloc(n * sizeof(int)); int* out = (int*)malloc(n * sizeof(int)); for(; i < n; i++){ scanf("%d", ar + i); br[i] = ar[i]; } qsort(br, n, sizeof(br[0]), cmp);//稳定 for(i = 0, j = 1; i < n-1;i++){//扫描一遍,完成各个数字对应rank任务 if(br[i] != br[i+1]){ rank[j++] = br[i]; rank[j] = br[i+1]; }else rank[j] = br[i]; } for( i = 0, jj = 0; i < n; i++) for(int ii = 1; ii <= j; ii++) if(ar[i] == rank[ii]){//扫描ar数组,out输出存输出 out[jj++] = ii; continue; } for(i = 0; i < jj-1; i++) printf("%d ", out[i]); printf("%d\n", out[i]); free(ar); free(br); free(rank); free(out); } return 0; }