delphi StringGrid排序

来源:岁月联盟 编辑:exp 时间:2012-06-02

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[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;
 
//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[i].assign(grid.rows[i]);
    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[list[i]])
    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

图片内容