浏览代码

* fixed bug in QuickSort_ItemList_CustomItemExchanger_Context and
QuickSort_ItemList_Context and which can cause wrong sort results, due to not
taking into account that the pivot can be moved by the swap operation

git-svn-id: trunk@41191 -

nickysn 6 年之前
父节点
当前提交
ea340b9481
共有 1 个文件被更改,包括 18 次插入4 次删除
  1. 18 4
      rtl/inc/sortbase.pp

+ 18 - 4
rtl/inc/sortbase.pp

@@ -183,9 +183,16 @@ var
           Dec(J);
         If I <= J then
         begin
-          Move((Items + ItemSize*I)^, TempBuf^, ItemSize);
-          Move((Items + ItemSize*J)^, (Items + ItemSize*I)^, ItemSize);
-          Move(TempBuf^, (Items + ItemSize*J)^, ItemSize);
+          if I < J then
+          begin
+            Move((Items + ItemSize*I)^, TempBuf^, ItemSize);
+            Move((Items + ItemSize*J)^, (Items + ItemSize*I)^, ItemSize);
+            Move(TempBuf^, (Items + ItemSize*J)^, ItemSize);
+            if P = (Items + ItemSize*I) then
+              P := Items + ItemSize*J
+            else if P = (Items + ItemSize*J) then
+              P := Items + ItemSize*I;
+          end;
           Inc(I);
           Dec(J);
         end;
@@ -239,7 +246,14 @@ procedure QuickSort_ItemList_CustomItemExchanger_Context(
           Dec(J);
         If I <= J then
         begin
-          Exchanger(Items + ItemSize*I, Items + ItemSize*J, Context);
+          if I < J then
+          begin
+            Exchanger(Items + ItemSize*I, Items + ItemSize*J, Context);
+            if P = (Items + ItemSize*I) then
+              P := Items + ItemSize*J
+            else if P = (Items + ItemSize*J) then
+              P := Items + ItemSize*I;
+          end;
           Inc(I);
           Dec(J);
         end;