急!!多列排序算法!

WindowsAPI 2005-09-14 03:20:14
我做的一个程序里需要对列表中的多个列进行排序.从网上下载的酸法都是只能排一列,我想是不是应该在原有算法的比较部分做一下改动,应该可以适应多列排序,但我怎么弄也不行.急请各位高手帮忙!!

我用的QuickSort,

procedure QSort(iLo,iHi:Integer);
var
Lo, Hi, Mid : Integer;
begin
Lo := iLo;
Hi := iHi;
Mid := (Lo + Hi) div 2;
repeat
while Compare(Self, Items[Lo],Items[Mid],gt) do Inc(Lo);
while Compare(Self, Items[Hi],Items[Mid],lt) do Dec(Hi);
if Lo <= Hi then
begin
exchange(Lo,Hi);
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QSort(iLo, Hi);
if Lo < iHi then QSort(Lo, iHi);
end;

其中:
Compare是回调函数,声明如下:

TCompareFunction = function (Sender:TCustomSort; const AItemA,AItemB : Pointer;
const AShouldBe : TCompare) : Boolean of Object;

...全文
274 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
青盟日志 2005-09-16
  • 打赏
  • 举报
回复
function TMemDataSet.CompareItem(Sender: TCustomSort; const AItemA,
AItemB: Pointer): Integer;
var
I : integer;
ACol: Integer;
Value1, Value2:Variant;
begin
Result := 0;

for I := 0 to Sender.CompareFields.ItemCount - 1 do
begin
{取得比较的列的序号}
ACol:=Sender.CompareFields.Items[i].FieldIndex;
{取得两条记录的数值}
Value1:=TMemRecord(AItemA).FieldValues[ACol];
Value2:=TMemRecord(AItemB).FieldValues[ACol];
{两条记录比较}
case Sender.CompareFields.Items[I].FieldType of
mftInteger:begin
Result := CompareInteger(Value1, Value2);
end;
mftFloat:begin
Result := CompareFloat(Value1, Value2);
end;
mftString:begin
Result := AnsiCompareText(Value1, Value2);
end;
mftBoolean:begin
Result := CompareBoolean(Value1, Value2);
end;
end;

{如果降序排列,则Flag取反}
if Sender.CompareFields.Items[I].SortOrder = csDesc then
Result := - Result;

{如果不是等于,则退出比较}
if Result <> 0 then Break;
end;
end;
jinjazz 2005-09-15
  • 打赏
  • 举报
回复
自己写个比较大小的函数代替"<",">"就可以了
andrew223 2005-09-15
  • 打赏
  • 举报
回复
//这是TMS Grids中单列排序算法,你可以下来看看
procedure TAdvStringGrid.SortByColumn(Col: Integer);
var
Idx: Word;
Changed: Boolean;
begin
if RowCount < 2 then
Exit;

if FSortSettings.Direction = sdAscending then
SortDir := 1
else
SortDir := -1;

repeat
Changed := False;
for Idx := FixedRows to RowCount - 2 - FixedFooters do
begin
if SortDir = Compare(Col,Idx,Idx + 1) then /
begin
SortSwapRows(Idx,Idx + 1);
Changed := True;
end;
end;
until Changed = False;
end;
andrew223 2005-09-15
  • 打赏
  • 举报
回复
单列排序算法要用顺序排序算法,这样多列排序就不会乱了。
效率满一些,没有问题
WindowsAPI 2005-09-14
  • 打赏
  • 举报
回复
调用了多次单列排序,但后面的排序影响到前面的列,结果顺序还是乱.
andrew223 2005-09-14
  • 打赏
  • 举报
回复
为什么不简单一些,调用多次单列排序,就已经是多列排序了。
只要分清多列排列顺序就可以了。
WindowsAPI 2005-09-14
  • 打赏
  • 举报
回复
lt是>;gt是<;eq是=;ltoeq是<>
WindowsAPI 2005-09-14
  • 打赏
  • 举报
回复
TCompare = (lt, gt, eq, ltOeq);

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧