1223: 数组排序
时间限制: 1 Sec 内存限制: 32 MB
提交: 9 解决: 4
[提交][状态][讨论版]
题目描述
输入一个数组的值,求出各个值从小到大排序后的次序。
输入
输入有多组数据。
每组输入的第一个数为数组的长度n(1<=n<=10000),后面的数为数组中的值,以空格分割。
输出
各输入的值按从小到大排列的次序(最后一个数字后面没有空格)。
样例输入
1
68
15
1 70 25 79 59 63 65 6 46 82 28 62 92 96 43
样例输出
1
1 11 3 12 7 9 10 2 6 13 4 8 14 15 5
提示
来源
//用数组来标记它的次序输出超限,不知道为什么得用二分法
//AC的
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int a[10010], b[10010], c[10010];
int Search(int arr[], int n, int x){
int left = 0, right = n-1;
int mid;
while(left <= right){
mid = (left+right)/2;
if(x == arr[mid])
return mid+1;
else if(x > arr[mid])
left = mid+1;
else
right = mid-1;
}
}
int main(){
int n, i;
while(scanf("%d", &n) != EOF){
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(a, a+n);
int k = 0;
for(int i = 0; i < n-1; i++){ //数组去重
if(a[i] != a[i+1]) //因为前后有比较,最后一个单独列出
c[k++] = a[i];
}
c[k++] = a[n-1];
for(int i = 0; i < n; i++){
if(i != n-1)
printf("%d ", Search(c, k, b[i]));
else
printf("%d\n", Search(c, k, b[i]));
}
}
return 0;
}
//原来写的 输出超限
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
int n;
int a[10010], b[10010], flag[10010];
while(1){
memset(a, 0, sizeof(a));
memset(flag, 0, sizeof(flag));
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(a, a+n+1);
int k = 1;
for(int i = 1; i < n ; i++){
if(a[i] != a[i+1])
flag[a[i]] = k++;
}
flag[a[n]]=k++;
for(int i = 1; i < n; i++){
printf("%d ", flag[b[i]]);
}
printf("%d\n", flag[b[n]]);
}
return 0;
}
时间限制: 1 Sec 内存限制: 32 MB
1223: 数组排序
提交: 9 解决: 4
[提交][状态][讨论版]题目描述
输入一个数组的值,求出各个值从小到大排序后的次序。
输入
输入有多组数据。
每组输入的第一个数为数组的长度n(1<=n<=10000),后面的数为数组中的值,以空格分割。输出
各输入的值按从小到大排列的次序(最后一个数字后面没有空格)。
样例输入
1 68 15 1 70 25 79 59 63 65 6 46 82 28 62 92 96 43
样例输出
1 1 11 3 12 7 9 10 2 6 13 4 8 14 15 5
提示
来源
//用数组来标记它的次序输出超限,不知道为什么得用二分法
//AC的
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int a[10010], b[10010], c[10010]; int Search(int arr[], int n, int x){ int left = 0, right = n-1; int mid; while(left <= right){ mid = (left+right)/2; if(x == arr[mid]) return mid+1; else if(x > arr[mid]) left = mid+1; else right = mid-1; } } int main(){ int n, i; while(scanf("%d", &n) != EOF){ memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); for(i = 0; i < n; i++){ scanf("%d", &a[i]); b[i] = a[i]; } sort(a, a+n); int k = 0; for(int i = 0; i < n-1; i++){ //数组去重 if(a[i] != a[i+1]) //因为前后有比较,最后一个单独列出 c[k++] = a[i]; } c[k++] = a[n-1]; for(int i = 0; i < n; i++){ if(i != n-1) printf("%d ", Search(c, k, b[i])); else printf("%d\n", Search(c, k, b[i])); } } return 0;
}
//原来写的 输出超限
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main(){ int n; int a[10010], b[10010], flag[10010]; while(1){ memset(a, 0, sizeof(a)); memset(flag, 0, sizeof(flag)); scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d", &a[i]); b[i] = a[i]; } sort(a, a+n+1); int k = 1; for(int i = 1; i < n ; i++){ if(a[i] != a[i+1]) flag[a[i]] = k++; } flag[a[n]]=k++; for(int i = 1; i < n; i++){ printf("%d ", flag[b[i]]); } printf("%d\n", flag[b[n]]); } return 0; }