16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:TListのSortで注意"
この発言は #00671 草薙いっぺい さんのRE:TListのSortで注意 に対するコメントです
この発言に対し以下のコメントが寄せられています
#00673 TN さん RE^2:TListのSortで注意
自己レスです。
----------------------------------------------------------
サンプルを作成してみました。
Memo1の数値列を Memo2にSort後出力しました。
(あくまでサンプルなので 数値列そのもののSortです。)
----------------------------------------------------------
で、やっぱり TNさんの
TAcntSubject,TAllotNote,SelectedSubjectTmpとか解りません。
class.pas とか いろいろ覗きましたが....
----------------------------------------------------------
<参考にさせて頂いた内容>
1.Beepさん、あほうどりさんの過去ログ (なんと 97/04)
2.サンプル蔵のCellさんの例
3.サンプル蔵のべあさんのマージソート例...無断借用しています。m(__)m
----------------------------------------------------------
implimentation以降です。
var
aTable: array of Double; // Sort対象数値列
SortType: Boolean; // 昇順:True 降順:False
type
TMergeList = class(TList)
public
procedure Sort(Compare: TListSortCompare);
end;
procedure TMergeList.Sort(Compare: TListSortCompare);
var
Tmp:PPointerList;
procedure MergeSort(First,Last: Integer);
var
I,J,K,P,Mid:Integer;
begin
if First < Last then
begin
Mid :=(First + Last) div 2;
MergeSort(First,Mid);
MergeSort(Mid+1,Last);
P := Mid - First + 1;
System.Move(List^[First],Tmp^[0], P * SizeOf(Pointer));
i := Mid + 1;
J := 0 ;
k := first;
while (i <= Last) and (J < P) do
if Compare(Tmp^[J],List^[I]) > 0 then
begin
List^[k] := List^[i];
Inc(k);
Inc(i);
end
else
begin
List^[k] := Tmp^[j];
Inc(k);
Inc(J);
end;
while j < P do
begin
List^[K] := Tmp^[j];
Inc(k);
Inc(j);
end;
end;
end;
begin
GetMem(Tmp,(count div 2 + 1) * SizeOf(Pointer));
try
MergeSort(0,Count-1);
finally
FreeMem(Tmp);
end;
end;
{以上は べあさんの MergeSortの機能を試したくて利用させて頂きました。}
{Sort比較コールバック関数}
function SortFunc(Item1,Item2: Pointer): Integer;
var
D1,D2: Double;
begin
D1 := Double(Item1^);
D2 := Double(Item2^);
if SortType then
begin
if D1 < D2 then Result := -1
else
if D1 > D2 then Result := 1
else Result := 0;
end
else
begin
if D1 < D2 then Result := 1
else
if D1 > D2 then Result := -1
else Result := 0;
end;
end;
procedure TForm1.GoBtnClick(Sender: TObject);
var
N: Integer;
StTime:TDateTime;
MList: TMergeList;
{Sort対象テーブルセット}
procedure MemoToTable;
var
N: Integer;
begin
SetLength(aTable,Memo1.Lines.Count);
for N := 0 to Memo1.Lines.Count-1 do
begin
aTable[N] := StrToFloat(Memo1.Lines[N]);
end;
end;
{Sort後のテーブルをMemoにセット}
procedure TableToMemo;
var
N: Integer;
PAns: Pointer;
Ans: Double;
begin
Memo2.Clear;
for N := 0 to MList.Count-1 do
begin
PAns := MList.Items[N]; // チョット ドジなやり方です。
Ans := Double(PAns^); // ポインターのお勉強です。(^^;)
Memo2.Lines.Add(FloatToStr(Ans));
end;
end;
begin
SortType := CheckBox1.Checked;
MList := TMergeList.Create;
MemoToTable;
{Sort対象テーブル(Pointer)をセット}
for N := 0 to High(aTable) do
MList.Add(@aTable[N]);
StTime := GetTickCount;
MList.Sort(SortFunc);
StatusBar1.Panels[1].Text :=
Format('所要時間=%.3n秒',[(GetTickCount-StTime)/1000]);
TableToMemo;
MList.Free;
end;
-------------------------------------------------------------------
ではでは。 草薙いっぺいデシタ。 (GBE02547) 98/10/06(火) 19:25
Original document by 草薙いっぺい 氏 ID:(GBE02547)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|