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