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;
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;
我这里写了个笨方法 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;
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;
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;
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;