一个数组中间有不定数目的空元素,现想把它们统统放到数组最后面,有没比较快且不太耗资源的算法?
比如
1,2,_,7,5,_,_,3
弄成
1,2,7,5,3,_,_,_ 另外我不会用TList,如果用它可以,请教我,谢谢先。

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      lst : array  of char;
        i,J : integer;
        v : char;
    begin   setLength(lst,8);
       lst[0] := '1';
       lst[1] := '2';
       lst[2] := '-';
       lst[3] := '7';
       lst[4] := '5';
       lst[5] := '-';
       lst[6] := '-';
       lst[7] := '3';
       for I := 0 to length(lst)-1 do begin
         for J := i+1 to length(lst) -1 do begin
           v := lst[i];
           if not ( V in ['0'..'9']) then  begin
            lst[i] := lst[j];
            lst[j] := v;
           end;
         end;
       end;   for I := 0 to length(lst)-1 do Memo1.Lines.Add(lst[i]) ;
    end;end.
      

  2.   

    改進下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      lst : array  of char;
        i,J : integer;
        v : char;
    begin   setLength(lst,8);
       lst[0] := '1';
       lst[1] := '2';
       lst[2] := '-';
       lst[3] := '7';
       lst[4] := '5';
       lst[5] := '-';
       lst[6] := '-';
       lst[7] := '3';
       for I := 0 to length(lst)-1 do begin
         for J := i+1 to length(lst) -1 do begin
           v := lst[i];
           if not ( V in ['0'..'9']) then  begin
             lst[i] := lst[j];
             lst[j] := v;
           end else break;
         end;
       end;   for I := 0 to length(lst)-1 do Memo1.Lines.Add(lst[i]) ;
    end;
      

  3.   

    查找并交换空元素(在数组前面的)与非空元素(在数组后面的), 这个算法速度比较快, 时间复杂度为O(n):procedure TForm1.Button1Click(Sender: TObject);
    var
      lst : array of char;
      i, j: integer;
      v   : char;
    begin
       setLength(lst, 8);
       lst[0] := '1';
       lst[1] := '2';
       lst[2] := '-';
       lst[3] := '7';
       lst[4] := '5';
       lst[5] := '-';
       lst[6] := '-';
       lst[7] := '3';   i := 0;
       j := Length(lst) - 1;
       while i < j do
       begin
        while (i < j) and (lst[i] <> '-') do inc(i);
        while (i < j) and (lst[j] = '-') do dec(j);
        if i < j then
        begin
          v := lst[i];
          lst[i] := lst[j];
          lst[j] := v;
        end;
       end;   for i := 0 to length(lst)-1 do Memo1.Lines.Add(lst[i]) ;
    end;
      

  4.   

    牺牲下空间,提高速度!
    再声明个相同size的数组
    原来A[10], 
    声明个B[10],初始化。循环A
    int j = 0;
    for(int i=0; i<10; i++)
    {
        if( A[i] != '' )
        {
            B[j]=A[i];
            j++;
        }
    }