灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:15268回复:0

delphi StringGrid排序

楼主#
更多 发布于:2012-09-08 13:06

delphi StringGrid排序
StringGrid排序函数
推荐高速排序函数(在StringGrid里加上5000行试试就知道它的效率了)【来自wyb_star】
【这个东西很强劲的,感谢 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;
  List := 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;

//datatype 0 按字符排序 1 按整型排序 2 按浮點型排序<BR>procedure SortGrid(Grid: TStringGrid; sortCol, dataType: integer);
var
  i: Integer;
  tempGrid: TStringGrid;
  list: array of Integer;
begin
  screen.cursor := crhourglass;
  tempGrid := TStringGrid.create(nil);

  with tempgrid do
  begin
    rowcount := grid.rowcount;
    colcount := grid.colcount;
    fixedrows := grid.fixedrows;
  end;

  with Grid do
  begin
    setlength(list, rowcount - fixedrows);
    for i := fixedrows to rowcount - 1 do
    begin
      list[i - fixedrows] := i;
      tempgrid.rows.assign(grid.rows);
    end;
    quicksort(Grid, list, 0, rowcount - fixedrows - 1, sortcol, datatype);
    for i := 0 to rowcount - fixedrows - 1 do
    begin
      rows[i + fixedrows].assign(tempgrid.rows
    )
        end;
        row := fixedrows;
      end;
      tempgrid.free;
      setlength(list, 0);
      screen.cursor := crdefault;
    end;

    procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      c: Integer;
      w: Integer;
      Grid: TStringGrid;
    begin
      Grid := Sender as TStringGrid;
      with Grid do
        if y <= rowheights[0] then
        begin
          c := 0;
          w := colwidths[0];
          while (c < colcount) and (w <= x) do
          begin
            Inc(c);
            w := w + colwidths[c] + gridlinewidth;
          end;
          SortGrid(Grid, c, 0);
        end;
    end;


    摘自 Ciske Liu


喜欢0 评分0
游客

返回顶部