主题:一道看似很简单的题目,关于排序!
5lemon
[专家分:0] 发布于 2006-09-28 21:09:00
给定长度为N (N<=500)的数据序列,将其排成从小到大的数据序列,并输出每个数据的原始输入顺序.
例如:
输入:
5
1 3 2 7 6
输出:
1 1
2 3
3 2
6 5
7 4
(我能从小到大进行排序,就是不知道怎么输出原始的输入顺序,望赐教!)
回复列表 (共4个回复)
沙发
maxumi [专家分:2200] 发布于 2006-09-29 07:43:00
给每个数作个标记就行了:
program lx;
var
sz:array[1..500,1..2] of integer;
i,j,n,t:integer;
begin
readln(n);
for i:=1 to n do begin
read(sz[i,1]);
sz[i,2]:=i;
end;
for i:=2 to n do
for j:=1 to i-1 do
if sz[i,1]<sz[j,1] then begin
t:=sz[i,1];
sz[i,1]:=sz[j,1];
sz[j,1]:=t;
t:=sz[i,2];
sz[i,2]:=sz[j,2];
sz[j,2]:=t;
end;
for i:=1 to n do
writeln(sz[i,1],' ',sz[i,2]);
end.
以上
板凳
senzhang [专家分:160] 发布于 2006-10-07 09:29:00
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
typedef struct point
{
int value;
int pos;
}Point;
int cmp(const void* va,const void* vb);
int main()
{
int n;
int i;
Point p[MAX];
scanf("%d",&n);
for(i = 0;i<n;i++)
{
scanf("%d",&(p[i].value));
p[i].pos = i+1;
}
qsort(p,n,sizeof(Point),cmp);
for(i = 0;i<n;i++)
{
printf("%d %d\n",p[i].value,p[i].pos);
}
return 0;
}
int cmp(const void* va,const void* vb)
{
Point *a,*b;
a = (Point*)va;
b = (Point*)vb;
if(a->value<b->value)
return -1;
else if(a->value==b->value)
return 0;
else
return 1;
}
3 楼
游侠UFO [专家分:1200] 发布于 2006-10-07 12:17:00
正如一楼所说,在读入数据时就将每个数的位置记录下来,排序时跟这数据走,这样就能达到目的了.除了用一楼二维数组的方式,还可以用记录类型.
4 楼
已死之人 [专家分:0] 发布于 2007-03-20 16:45:00
正如一楼所述,很简单的一道题,不是吗?
[em18]
我来回复