将一维数组20个元素值,由重复多到少,大到小进行排序。请给出算法。

解决方案 »

  1.   


      for Temp := 0 to PointNum do
      begin
        //所有数从大到小排列
        for LoopCount := 0 to PointNum - 1 do
         if Wave2ReceBuf_Bub[LoopCount] < Wave2ReceBuf_Bub[LoopCount + 1] then
           Swap(Wave2ReceBuf_Bub[LoopCount],Wave2ReceBuf_Bub[LoopCount + 1]);
      end;
    //交换两个数
    procedure Swap(var X,Y: SmallInt);stdcall;
    var
      Temp: Integer;
    begin
      Temp := X;
      X := Y;
      Y := Temp;
    end;
      

  2.   


    type
      TDataArray = array[1..20] of Integer;procedure DataArraySort(var AData: TDataArray);
    var
      Num, Cnt  : TDataArray;
      N, i, j, k: Integer;
    begin
      //统计各数字出现的次数
      for i := Low(AData) to High(AData) do Cnt[i] := 0;
      N := Low(AData) - 1;
      for i := Low(AData) to High(AData) do
      begin
        k := 0;
        for j := Low(AData) to N do
          if AData[i] = Num[j] then
          begin
            inc(Cnt[j]);
            k := 1;
            break;
          end;
        if k = 0 then
        begin
          inc(N);
          Num[N] := AData[i];
          Cnt[N] := 1;
        end;
      end;
      //排序
      for i := Low(AData) to N do
        for j := i + 1 to N do
        begin
          if (Cnt[i] < Cnt[j]) or ((Cnt[i] = Cnt[j]) and (Num[i] < Num[j])) then
          begin
            k := Cnt[i];
            Cnt[i] := Cnt[j];
            Cnt[j] := k;
            k := Num[i];
            Num[i] := Num[j];
            Num[j] := k;
          end;
        end;
      //输出排序结果
      k := 1;
      for i := Low(AData) to N do
        for j := 1 to Cnt[i] do
        begin
          AData[k] := Num[i];
          inc(k);
        end;
    end;//调用的例子
    var
      AData: TDataArray;
      i : Integer;
    begin
      AData[1] := 2;
      AData[2] := 1;
      AData[3] := 3;
      AData[4] := 1;
      AData[5] := 1;
      AData[6] := 3;
      AData[7] := 1;
      AData[8] := 2;
      AData[9] := 1;
      AData[10] := 1;
      AData[11] := 4;
      AData[12] := 1;
      AData[13] := 4;
      AData[14] := 1;
      AData[15] := 3;
      AData[16] := 2;
      AData[17] := 1;
      AData[18] := 4;
      AData[19] := 1;
      AData[20] := 1;
      DataArraySort(AData);
      for i := Low(AData) to High(AData) do
        Memo1.Lines.Add(IntToStr(Adata[i]));
    end;
      

  3.   

    我这里写了个笨方法
    var
      Form1: TForm1;
      s : array[0..19] of string =
        ('15','10','15','10','10','6','6','4','4','4','1','2','2','2','2','7','9','11','11','12');implementation{$R *.dfm}{ TForm1 }procedure TForm1.OrderByMultiRules(var s: array of string);
    var
      i, j, k, m: Integer;
      ts: TStringList;
      tmp,tmpNum: string;
      repStr : array of array of string;
    begin
      ts := TStringList.Create;
      try
        //先排序
        m := Length(s) - 1;
        while m > 0 do
        begin
          k := 0;
          for i := 0 to m - 1 do
            if StrToInt(s[i]) < StrToInt(s[Succ(i)]) then
            begin
              tmp := s[i];
              s[i] := s[Succ(i)];
              s[Succ(i)] := tmp;
              k := i; //记录本次换位发生的位置
            end;
          m := k; //本循环后发生交换的位置
        end;
        SetLength(repStr,Length(s),2);//设定 repStr 的长度
        //判定每个值重复次数
        k := 0;
        repStr[0,0] := s[0];
        repStr[0,1] := '1';
        for i := 1 to Length(s) - 1 do
        begin
          if s[i] = repStr[k,0] then
            repStr[k,1] := IntToStr(StrToInt(repStr[k,1]) + 1)
          else
          begin
            Inc(k);
            repStr[k,0] := s[i];
            repStr[k,1] := '1';
          end;
        end;
        //再次排序,按重复次数排
        m := Length(s) - 1;
        while m > 0 do
        begin
          k := 0;
          for i := 0 to m - 1 do
            if repStr[Succ(i),1] = '' then
            begin
              Break;
            end
            else
            if StrToInt(repStr[i,1]) < StrToInt(repStr[Succ(i),1]) then
            begin
              tmp := repStr[i,0];
              tmpNum := repStr[i,1];
              repStr[i,0] := repStr[Succ(i),0];
              repStr[i,1] := repStr[Succ(i),1];
              repStr[Succ(i),0] := tmp;
              repStr[Succ(i),1] := tmpNum;
              k := i; //记录本次换位发生的位置
            end;
          m := k; //本循环后发生交换的位置
        end;
        //输出
        i := 0;
        k := 0;
        while i < Length(s) do
        begin
          for j := 0 to StrToInt(repStr[k,1]) - 1 do
          begin
            s[i] := repStr[k,0];
            inc(i);
          end;
          Inc(k);
        end;
      finally
        FreeAndNil(ts);
      end;
    end;procedure TForm1.btn1Click(Sender: TObject);
    var
      i : Integer;
      a : string;
    begin
      a := '';
      OrderByMultiRules(s);
      for i := 0 to Length(s) - 1 do
        a := a + s[i] + ',';
      ShowMessage(a);
    end;