- 题目1167:数组排序
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2107
解决:654
- 题目描述:
-
输入一个数组的值,求出各个值从小到大排序后的次序。
- 输入:
-
输入有多组数据。
每组输入的第一个数为数组的长度n(1<=n<=10000),后面的数为数组中的值,以空格分割。
- 输出:
-
各输入的值按从小到大排列的次序(最后一个数字后面没有空格)。
- 样例输入:
-
4 -3 75 12 -3
- 样例输出:
-
1 3 2 1
- 来源:
- 2009年北京航空航天大学计算机研究生机试真题
- -------
- 这道题的题干有点难理解,不看样例输入和输出你完全不知道它想表达什么意思。
- 可以这样理解:将一个无序数组排序并删除重复数值以后,旧数组的每个值在新数组中的位序。
- 这样通过以下三步可以达成目的:
- 1、将无序数组排序,生成新数组。
- 2、将新数组重复值删除。
- 3、遍历旧数组,输出旧数组每个值在新数组中的位序。
- C++代码如下:
-
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 5 //定位函数,参数依次为:待查找数组,查找次数,查找值 6 int locate(int array[], int n, int value) 7 { 8 for(int i=0; i<n; i++) 9 { 10 if(value == array[i]) 11 return i+1; 12 } 13 } 14 //消除有序数组中的重复数值,参数依次为:待删除数组,数组长度。 15 int unique(int result[], int length) 16 { 17 int i; 18 int count = 0; 19 //自己推出来的算法,还算简洁 20 for(i = 0; i<length; i++) 21 { 22 if(result[i] == result[i+1]) 23 count++; 24 else 25 result[i+1-count] = result[i+1]; 26 } 27 return count; //删掉的元素总数。 28 } 29 30 int main() 31 { 32 int input[10000], result[10000]; 33 int length, i; 34 while( scanf("%d", &length) != EOF) 35 { 36 for(i = 0; i<length; i++) 37 { 38 scanf("%d", &input[i]); 39 result[i] = input[i]; 40 } 41 //今天刚学的STL排序函数,来自<algorithm>库,多快好省,比较赖皮。默认为升序排列。 42 sort(result, result+length); 43 //去除重复元素,count为删掉的元素数 44 int count = unique(result, length); 45 46 int resultLength = length - count; 47 //遍历原数组,输出其每个元素在新数组中的位序 48 for(i = 0; i< length; i++) 49 { 50 printf("%d", locate(result, resultLength, input[i])); 51 if(i != length - 1) 52 printf(" "); 53 } 54 55 printf("\n"); 56 } 57 return 0; 58 }
已AC:
1 /************************************************************** 2 Problem: 1167 3 User: kkzxak47 4 Language: C++ 5 Result: Accepted 6 Time:70 ms 7 Memory:1012 kb 8 ****************************************************************/
-
今天下午的成果,编程学习算是开了个头。