-
题目描述:
-
输入一个数组的值,求出各个值从小到大排序后的次序。
-
输入:
-
输入有多组数据。
每组输入的第一个数为数组的长度n(1<=n<=10000),后面的数为数组中的值,以空格分割。
-
输出:
-
各输入的值按从小到大排列的次序(最后一个数字后面没有空格)。
-
样例输入:
-
4 -3 75 12 -3
-
样例输出:
-
1 3 2 1
-
解决方法
-
三个数组,一个原来,一个排序,一个经过排序后去重
-
然后在去重后的中找原来的,输出位置即可。
-
在排序去重一步中,可能连续都是一样的,所以最后一定要有一个在上面
-
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int array[10010]; int array1[10010]; int array2[10010]; int Search(int a[], int n, int x)//二分查找 { int left = 0, right = n - 1; while (left <=right) { int middle = (left + right) / 2; if (a[middle] == x) return middle + 1; else if (a[middle] < x) left = middle + 1; else right = middle - 1; } } int main() { int length, i; while (scanf("%d", &length) != EOF) { for (i = 0; i < length; i++) { scanf("%d", &array[i]); array1[i] = array[i]; } sort(array1, array1 + length); int k = 0; for (i = 0; i < length - 1; i++)//数组去重 { if (array1[i] != array1[i + 1]) array2[k++] = array1[i]; } array2[k++] = array1[length -1]; for (i = 0; i < length; i++) { if (i != length - 1) printf("%d ", Search(array2, k, array[i])); else printf("%d\n", Search(array2, k, array[i])); } } return 0; }