快速排序脚本有效,但堆排序脚本无效
Quicksort script works, but heapsort one doesn't
我一直在使用快速排序函数对我的字符串列表进行排序,但作为练习,我也想尝试编写堆排序函数。不幸的是它不起作用,我不明白为什么。我使用的实用函数有效(因为我也在快速排序脚本中使用它们并且在列表中尝试了两个,快速排序一个有效而另一个无效)
{------------------------------------------------------------------------------}
Procedure Heapify(AList : TStringList; N, Root : Integer);
Var
Max, L, R : Integer;
Begin
Max := Root;
L := (2 * Root) + 1;
R := (2 * Root) + 2;
If (L < N) And (ListSort(AList, Max, L) < 0 {function to compare strings, read as List[L]>List[Max]}) Then Max := L;
If (R < N) And (ListSort(AList, Max, R) < 0) Then Max := R;
If Max <> Root Then
Begin
ExchangeItems(AList, Root, Max); {Function to swap strings}
Heapify(AList, N, Max);
End;
End;
{------------------------------------------------------------------------------}
Procedure HeapSortStringList(AList : TStringList);
Var
I : Integer;
Begin
For I := (AList.Count / 2) - 1 DownTo 0 Do Heapify(AList, AList.Count, I);
For I := AList.Count - 1 DownTo 1 Do
Begin
ExchangeItems(AList, I, 0);
Heapify(AList, I, 0);
End;
End;
{------------------------------------------------------------------------------}
你是如何编译这段代码的?
注意编译器给我们消息:
[dcc32 Error] Unit2.pas(175): E2010 Incompatible types: 'Integer' and
'Extended'
(AList.Count / 2)
对于整数
应该是 (AList.Count div 2)
此更正代码生效后。
我一直在使用快速排序函数对我的字符串列表进行排序,但作为练习,我也想尝试编写堆排序函数。不幸的是它不起作用,我不明白为什么。我使用的实用函数有效(因为我也在快速排序脚本中使用它们并且在列表中尝试了两个,快速排序一个有效而另一个无效)
{------------------------------------------------------------------------------}
Procedure Heapify(AList : TStringList; N, Root : Integer);
Var
Max, L, R : Integer;
Begin
Max := Root;
L := (2 * Root) + 1;
R := (2 * Root) + 2;
If (L < N) And (ListSort(AList, Max, L) < 0 {function to compare strings, read as List[L]>List[Max]}) Then Max := L;
If (R < N) And (ListSort(AList, Max, R) < 0) Then Max := R;
If Max <> Root Then
Begin
ExchangeItems(AList, Root, Max); {Function to swap strings}
Heapify(AList, N, Max);
End;
End;
{------------------------------------------------------------------------------}
Procedure HeapSortStringList(AList : TStringList);
Var
I : Integer;
Begin
For I := (AList.Count / 2) - 1 DownTo 0 Do Heapify(AList, AList.Count, I);
For I := AList.Count - 1 DownTo 1 Do
Begin
ExchangeItems(AList, I, 0);
Heapify(AList, I, 0);
End;
End;
{------------------------------------------------------------------------------}
你是如何编译这段代码的?
注意编译器给我们消息:
[dcc32 Error] Unit2.pas(175): E2010 Incompatible types: 'Integer' and 'Extended'
(AList.Count / 2)
对于整数
(AList.Count div 2)
此更正代码生效后。