设为首页收藏本站

Delphi乐园 开发者的家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

高速排序函数(在StringGrid里加上5000行试试就知道它的效率了

发布者: 总理 | 发布时间: 2011-12-3 00:28| 查看数: 3442| 评论数: 36|帖子模式

【这个东西很强劲的,感谢 wyb_Star 提供】

高速排序函数(在StringGrid里加上5000行试试就知道它的效率了)
procedure Quicksort(Grid:TStringGrid; var List:array of integer;
   min, max,sortcol,datatype: Integer);
{List is a list of rownumbers in the grid being sorted}
var
med_value : integer;
hi, lo, i : Integer;

function compare(val1,val2:string):integer;
var
   int1,int2:integer;
   float1,float2:extended;
   errcode:integer;
begin
   case datatype of
     0: result:=ANSIComparetext(val1,val2);
     1: begin
          int1:=strtointdef(val1,0);
          int2:=strtointdef(val2,0);
          if int1>int2 then result:=1
          else if int1<int2 then result:=-1
          else result:=0;
        end;

     2: begin
          val(val1,float1,errcode);
          if errcode<>0 then float1:=0;
          val(val2,float2,errcode);
          if errcode<>0 then float2:=0;
          if float1>float2 then result:=1
          else if float1<float2 then result:=-1
          else result:=0;
        end;
      else result:=0;
   end;
end;

begin
{If the list has <= 1 element, it's sorted}
if (min >= max) then Exit;
{Pick a dividing item randomly}
i := min + Trunc(Random(max - min + 1));
med_value := List[i];
List[i] := List[min]; { Swap it to the front so we can find it easily}
{Move the items smaller than this into the left
  half of the list. Move the others into the right}
lo := min;
hi := max;
while (True) do
begin
   // Look down from hi for a value < med_value.
   while compare(Grid.cells[sortcol,List[hi]]
                        ,grid.cells[sortcol,med_value])>=0 do
   (*ANSIComparetext(Grid.cells[sortcol,List[hi]]
                        ,grid.cells[sortcol,med_value])>=0 do*)
   begin
       hi := hi - 1;
       if (hi <= lo) then Break;
   end;
   if (hi <= lo) then
   begin {We're done separating the items}
     List[lo] := med_value;
     Break;
   end;

   // Swap the lo and hi values.
   List[lo] := List[hi];
   inc(lo); {Look up from lo for a value >= med_value}
   while Compare(grid.cells[sortcol,List[lo]],
            grid.cells[sortcol,med_value])<0 do
   begin
       inc(lo);
       if (lo >= hi) then break;
   end;
   if (lo >= hi) then
   begin  {We're done separating the items}
     lo := hi;
     List[hi] := med_value;
     break;
   end;
   List[hi] := List[lo];
end;
{Sort the two sublists}
Quicksort(Grid,List, min, lo - 1,sortcol,datatype);
Quicksort(Grid,List, lo + 1, max,sortcol,datatype);
end;

最新评论

dsfstef 发表于 2011-12-9 16:14:38
提示: 作者被禁止或删除 内容自动屏蔽
bbcjqcwj 发表于 2011-12-28 09:48:06

上海kai发票 哈尔滨餐饮发票,哈尔滨住宿发票,哈尔滨发

提示: 作者被禁止或删除 内容自动屏蔽
qqb447983 发表于 2012-1-1 06:19:48
提示: 作者被禁止或删除 内容自动屏蔽
爱巧铃9 发表于 2012-1-6 15:37:40
提示: 作者被禁止或删除 内容自动屏蔽
低调的过 发表于 2012-1-8 22:57:49
提示: 作者被禁止或删除 内容自动屏蔽
海总001 发表于 2012-1-17 13:52:24
提示: 作者被禁止或删除 内容自动屏蔽
说你爱我N 发表于 2012-1-18 11:15:21
提示: 作者被禁止或删除 内容自动屏蔽
韩水心 发表于 2012-1-22 05:14:08
顶......叹为观止.....













修真界败类 武动乾坤5200
笑傲1233ptl 发表于 2012-1-22 16:42:39
提示: 作者被禁止或删除 内容自动屏蔽
xifan5 发表于 2012-2-8 21:48:32
提示: 作者被禁止或删除 内容自动屏蔽
妖的尾巴 发表于 2012-2-14 03:04:20
提示: 作者被禁止或删除 内容自动屏蔽
小米粒520 发表于 2012-2-14 09:59:15
提示: 作者被禁止或删除 内容自动屏蔽
狐狸的诱惑 发表于 2012-2-18 14:13:04
提示: 作者被禁止或删除 内容自动屏蔽
Chmristinec 发表于 2012-2-22 12:49:13
提示: 作者被禁止或删除 内容自动屏蔽
ohaojiuq 发表于 2012-2-23 04:31:37
提示: 作者被禁止或删除 内容自动屏蔽
火神 发表于 2012-2-23 04:36:41
提示: 作者被禁止或删除 内容自动屏蔽
小七战士 发表于 2012-2-23 15:38:16
提示: 作者被禁止或删除 内容自动屏蔽
ftzop 发表于 2012-2-23 23:33:19
提示: 作者被禁止或删除 内容自动屏蔽
wanghuaxs 发表于 2012-2-25 19:00:49
提示: 作者被禁止或删除 内容自动屏蔽
空间、域名、优惠稳定。香港空间1元,美国2元。

手机版|Delphi乐园 ( 冀ICP备11023363号-7 )    

GMT+8, 2016-10-23 02:23

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

公网安备 14090202000504号

回顶部