请大侠指教,给个算法。
要求对数组中的值排序,然后输出原来值在排序中的位置。例如:
原来的数组值为:
A[0]=3
A[1]=4
A[2]=2
A[3]=0
A[4]=6
要求排序的时候,去掉0值。从1算起。输出结果如下: 
A[0]=2 
A[1]=3
A[2]=1
A[3]=0
A[4]=4请指教!谢谢!

解决方案 »

  1.   

    不知你是不是要的排序后的下标,简单做了一下
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      myarr:array[0..4] of byte;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
    myarr[0]:=3;
    myarr[1]:=2;
    myarr[2]:=7;
    myarr[3]:=9;
    myarr[4]:=5;
    end;procedure TForm1.Button1Click(Sender: TObject);
    type
    ARec=record
    value,po:integer;
    end;
    var
    Arr:array of ARec;
    ResultArr:array of ARec;
    temp:ARec;
    i,j:integer;
    begin
    SetLength(arr,length(myarr));
    SetLength(resultarr,length(myarr));
    for i:=low(myarr) to high(myarr) do
       begin
       arr[i].value:=myarr[i];
       arr[i].po:=i;
       end;
    for i:=low(arr) to high(arr)-1 do
       for j:=low(arr) to high(arr)-1 do
          if arr[j].value>arr[j+1].value then
             begin
             temp:=arr[j];
             arr[j]:=arr[j+1];
             arr[j+1]:=temp;
             end;for i:=low(arr) to high(arr) do
      memo1.Lines.Add('值:'+inttostr(arr[i].value)+' 下标:'+inttostr(arr[i].po));
    setlength(arr,0);
    setlength(resultarr,0);
    end;end.
      

  2.   

    hys_427 ,您的例子的输入结果应该是:
    2,1,4,5,3数据:
    myarr[0]:=3; 
    myarr[1]:=2; 
    myarr[2]:=7; 
    myarr[3]:=9; 
    myarr[4]:=5; 
    排序后的结果是:2,3,5,7,9
    我要的结果是:
    3在排序后的序列中在第2位
    2在排序后的序列中在第1位
    7在排序后的序列中在第4位
    9在排序后的序列中在第5位
    5在排序后的序列中在第3位其中要考虑重复数据和0的情况,0不参加排序。
    不知道这样是否说明白了?           
      

  3.   

    Unsigned,这样的描述简明扼要,给个算法?
      

  4.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
       tmp1 : array  of  array[1..2]  of  integer;  //原来有数据,利用二维数组记录数据及下标
       tmp2 : array  of  array[1..2]  of  integer;  //排序后数据,利用二维数组记录数据新下标
       i,j:integer;
       t,t1:integer;
    begin
       if Memo1.Lines.Count <=0 then exit;         
       SetLength( tmp1, Memo1.Lines.Count);    //按Memo1.Lines.Count设置数组长度    
       SetLength( tmp2, Memo1.Lines.Count);
       for i:=0 to  Memo1.Lines.Count-1 do    //利用Memo1进行数据初始化tmp1,tmp2
       begin
           tmp1[i,1]   := strtoint(Memo1.Lines[i]);
           tmp1[i,2]   := i;
           tmp2[i,1]   := strtoint(Memo1.Lines[i]);
           tmp2[i,2]   := i;
       end;
       for  i:=  Memo1.Lines.Count-1 downto 0  do    //利用冒泡法进行排序
       begin
           for j:=0 to i do
           begin
                if tmp2[j,1]=0 then continue ;     //进行比较时,若比较值为0则不进行排序
                if tmp2[j+1,1]=0 then              //进行比较时,被比较值为0时则与下一个被比较值进行比较
                begin
                     if tmp2[j,1] > tmp2[j+2,1] then  ]; // 比较值的大小
                     begin
                          t  :=  tmp2[j,1];
                          t1 :=  tmp2[j,2];                      tmp2[j,1]   := tmp2[j+2,1     //进行冒泡
                          tmp2[j+2,1] := t ;                      tmp2[j,2]   :=  tmp2[j+2,2];  //同时更换下标
                          tmp2[j+2,2] :=  t1;
                      end ;
                end
                else                                    //若比较值和被比较值都不为0则进行比较
                 begin
                      if tmp2[j,1] > tmp2[j+1,1] then  //同上
                      begin
                           t  :=  tmp2[j,1];
                           t1 :=  tmp2[j,2];                       tmp2[j,1]   := tmp2[j+1,1]; //同上
                           tmp2[j+1,1] := t ;                       tmp2[j,2]   :=  tmp2[j+1,2];//同上
                           tmp2[j+1,2]   := t1;
                       end;
                 end;
            end;
       end;  for  i:= 0 to Memo1.Lines.Count-1 do          
          begin
          Memo2.Lines.Add(inttostr(tmp2[i,1])+','+inttostr(tmp2[i,2]) );//输出排序后数据,
          tmp1[tmp2[i,2],2] := i;                                      //反向查找原有数据在排序后数据中的下标
          end;  for  i:= 0 to Memo1.Lines.Count-1 do
          begin
          Memo3.Lines.Add(inttostr(tmp1[i,1])+','+inttostr(tmp1[i,2]) ); //输出原有数据在排序后的下标
          end;
    end;
      

  5.   

    如何0不参加排序和不能重复,那你以
    myarr[0]:=3; 
    myarr[1]:=0; 
    myarr[2]:=5; 
    myarr[3]:=9; 
    myarr[4]:=5;
    为例子,说一下结果输出结果应该是什么 
      

  6.   

    如何0不参加排序和不能重复,那你以 
    myarr[0]:=3; 
    myarr[1]:=0; 
    myarr[2]:=5; 
    myarr[3]:=9; 
    myarr[4]:=5; 
    为例子,说一下结果输出结果应该是什么 
    1
    0
    2
    3
    2
      

  7.   

    flychenjun:忽略了一种情况,重复数据要排在同一个位次。