回 帖 发 新 帖 刷新版面

主题:一道看似很简单的题目,关于排序!

给定长度为N (N<=500)的数据序列,将其排成从小到大的数据序列,并输出每个数据的原始输入顺序.
例如:
输入:
5
1 3 2 7 6
输出:
1  1
2  3
3  2
6  5
7  4

(我能从小到大进行排序,就是不知道怎么输出原始的输入顺序,望赐教!)

回复列表 (共4个回复)

沙发

给每个数作个标记就行了:
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.

以上

板凳

#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 楼

正如一楼所说,在读入数据时就将每个数的位置记录下来,排序时跟这数据走,这样就能达到目的了.除了用一楼二维数组的方式,还可以用记录类型.

4 楼

正如一楼所述,很简单的一道题,不是吗?
[em18]

我来回复

您尚未登录,请登录后再回复。点此登录或注册