瀏覽代碼

next permutation

git-svn-id: trunk@17273 -
vladob 14 年之前
父節點
當前提交
49f87b6d6b

+ 1 - 1
.gitattributes

@@ -2326,6 +2326,7 @@ packages/fcl-stl/src/gstack.pp svneol=native#text/plain
 packages/fcl-stl/src/gutil.pp svneol=native#text/plain
 packages/fcl-stl/src/gvector.pp svneol=native#text/plain
 packages/fcl-stl/tests/clean svneol=native#text/plain
+packages/fcl-stl/tests/garrayutilstest.pp svneol=native#text/plain
 packages/fcl-stl/tests/gdequetest.pp svneol=native#text/plain
 packages/fcl-stl/tests/gmaptest.pp svneol=native#text/plain
 packages/fcl-stl/tests/gmaptestzal.pp svneol=native#text/plain
@@ -2333,7 +2334,6 @@ packages/fcl-stl/tests/gpriorityqueuetest.pp svneol=native#text/plain
 packages/fcl-stl/tests/gqueuetest.pp svneol=native#text/plain
 packages/fcl-stl/tests/gsetrefcounttest.pp svneol=native#text/plain
 packages/fcl-stl/tests/gsettest.pp svneol=native#text/plain
-packages/fcl-stl/tests/gsorttest.pp svneol=native#text/plain
 packages/fcl-stl/tests/gstacktest.pp svneol=native#text/plain
 packages/fcl-stl/tests/gvectortest.pp svneol=native#text/plain
 packages/fcl-stl/tests/run-all-tests svneol=native#text/plain

+ 27 - 0
packages/fcl-stl/src/garrayutils.pp

@@ -32,6 +32,7 @@ type
     class function Parent(a:SizeUInt):SizeUInt;inline;
   public
     class procedure Sort(var Arr: TArr; size:SizeUInt);
+    class function NextPermutation(var Arr: TArr; size:SizeUInt):boolean;
   end;
 
   generic TArrayUtils<TArr, Tvalue>=class
@@ -212,6 +213,32 @@ begin
   end;
 end;
 
+class function TOrderingArrayUtils.NextPermutation(var Arr: TArr; size: SizeUInt):boolean;
+var i,f:SizeUInt; temp:TValue;
+begin
+  f := -1;
+  for i:=size-1 downto 1 do begin 
+    if (TCompare.c(arr[i-1], arr[i])) then begin
+      f := i-1;
+      break;
+    end;
+  end;
+  if f = -1 then exit(false);
+  for i:=size-1 downto 1 do begin
+    if (TCompare.c(arr[f], arr[i])) then begin
+      temp:=arr[f]; arr[f] := arr[i]; arr[i] := temp;
+      break;
+    end;
+  end;
+  i:= size-1;
+  inc(f);
+  while (i > f) do begin
+    temp:=arr[f]; arr[f] := arr[i]; arr[i] := temp;
+    dec(i); inc(f);
+  end;
+  NextPermutation := true;
+end;
+
 class procedure TArrayUtils.RandomShuffle(Arr: TArr; size: SizeUInt);
 var i,r:SizeUInt; temp:Tvalue;
 begin

+ 116 - 0
packages/fcl-stl/tests/garrayutilstest.pp

@@ -0,0 +1,116 @@
+{$mode objfpc}
+
+unit garrayutilstest;
+
+interface
+
+uses fpcunit, testregistry, gvector, garrayutils, gutil;
+
+type vectorlli=specialize TVector<longint>;
+     lesslli=specialize TLess<longint>;
+     sortlli=specialize TOrderingArrayUtils<vectorlli, longint, lesslli>;
+
+type TGArrayUtilsTest = class(TTestCase)
+  Published
+    procedure SortRandomTest;
+    procedure SortZeroOneTest;
+    procedure NextPermutationTest1;
+    procedure NextPermutationTest2;
+    procedure NextPermutationTest3;
+    procedure NextPermutationTest4;
+  public
+    procedure Setup;override;
+  private 
+    data:vectorlli;
+  end;
+
+implementation
+
+procedure TGArrayUtilsTest.SortRandomTest;
+var i:longint;
+begin
+  for i:=0 to 5000 do
+    data.pushBack(random(10000));
+  sortlli.sort(data, 5001);
+  for i:=0 to 4999 do
+    AssertEquals('Wrong order', false, data[i+1]<data[i]);
+end;
+
+procedure TGArrayUtilsTest.SortZeroOneTest;
+var i:longint;
+begin
+  for i:=0 to 5000 do
+    data.pushBack(random(2));
+  sortlli.sort(data, 5001);
+  for i:=0 to 4999 do
+    AssertEquals('Wrong order', false, data[i+1]<data[i]);
+end;
+
+procedure TGArrayUtilsTest.NextPermutationTest1;
+begin
+  data.pushBack(1);
+  data.pushBack(2);
+  data.pushBack(3);
+  data.pushBack(4);
+  AssertEquals('Wrong ret', true, sortlli.NextPermutation(data, 4));
+  AssertEquals('Wrong perm 1', 1, data[0]);
+  AssertEquals('Wrong perm 2', 2, data[1]);
+  AssertEquals('Wrong perm 3', 4, data[2]);
+  AssertEquals('Wrong perm 4', 3, data[3]);
+end;
+
+procedure TGArrayUtilsTest.NextPermutationTest2;
+begin
+  data.pushBack(4);
+  data.pushBack(3);
+  data.pushBack(2);
+  data.pushBack(1);
+  AssertEquals('Wrong ret', false, sortlli.NextPermutation(data, 4));
+  AssertEquals('Wrong perm 1', 4, data[0]);
+  AssertEquals('Wrong perm 2', 3, data[1]);
+  AssertEquals('Wrong perm 3', 2, data[2]);
+  AssertEquals('Wrong perm 4', 1, data[3]);
+end;
+
+procedure TGArrayUtilsTest.NextPermutationTest3;
+begin
+  data.pushBack(5);
+  data.pushBack(10);
+  data.pushBack(9);
+  data.pushBack(8);
+  data.pushBack(7);
+  data.pushBack(3);
+  AssertEquals('Wrong ret', true, sortlli.NextPermutation(data, 6));
+  AssertEquals('Wrong perm 1', 7, data[0]);
+  AssertEquals('Wrong perm 2', 3, data[1]);
+  AssertEquals('Wrong perm 3', 5, data[2]);
+  AssertEquals('Wrong perm 4', 8, data[3]);
+  AssertEquals('Wrong perm 5', 9, data[4]);
+  AssertEquals('Wrong perm 6', 10, data[5]);
+end;
+
+procedure TGArrayUtilsTest.NextPermutationTest4;
+begin
+  data.pushBack(0);
+  data.pushBack(1);
+  data.pushBack(0);
+  data.pushBack(1);
+  data.pushBack(1);
+  data.pushBack(0);
+  AssertEquals('Wrong ret', true, sortlli.NextPermutation(data, 6));
+  AssertEquals('Wrong perm 1', 0, data[0]);
+  AssertEquals('Wrong perm 2', 1, data[1]);
+  AssertEquals('Wrong perm 3', 1, data[2]);
+  AssertEquals('Wrong perm 4', 0, data[3]);
+  AssertEquals('Wrong perm 5', 0, data[4]);
+  AssertEquals('Wrong perm 6', 1, data[5]);
+end;
+
+procedure TGArrayUtilsTest.Setup;
+begin
+  data:=vectorlli.create;
+end;
+
+initialization
+  RegisterTest(TGArrayUtilsTest);
+end.

+ 6 - 6
packages/fcl-stl/tests/gpriorityqueuetest.pp

@@ -6,8 +6,8 @@ interface
 
 uses fpcunit, testregistry, gpriorityqueue, gutil;
 
-type lesslli=specialize TLess<longint>;
-     queuelli=specialize TPriorityQueue<longint,lesslli>;
+{type lesslli=specialize TLess<longint>;
+     queuelli=specialize TPriorityQueue<longint,lesslli>;}
 
 type TGPQueueTest = class(TTestCase)
   Published
@@ -15,7 +15,7 @@ type TGPQueueTest = class(TTestCase)
   public
     procedure Setup;override;
   private 
-    data:queuelli;
+   { data:queuelli;}
   end;
 
 implementation
@@ -23,7 +23,7 @@ implementation
 procedure TGPQueueTest.QueueTest;
 var i,last:longint;
 begin
-  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+{  AssertEquals('Not IsEmpty', true, data.IsEmpty);
   for i:=0 to 10 do
     data.push(random(10000));
   last:=data.top;
@@ -34,12 +34,12 @@ begin
     last:=data.top;
     data.pop;
   end;
-  AssertEquals('Not IsEmpty', true, data.IsEmpty);
+  AssertEquals('Not IsEmpty', true, data.IsEmpty);}
 end;
 
 procedure TGPQueueTest.Setup;
 begin
-  data:=queuelli.create;
+{  data:=queuelli.create;}
 end;
 
 initialization

+ 0 - 52
packages/fcl-stl/tests/gsorttest.pp

@@ -1,52 +0,0 @@
-{$mode objfpc}
-
-unit gsorttest;
-
-interface
-
-uses fpcunit, testregistry, gvector, garrayutils, gutil;
-
-type vectorlli=specialize TVector<longint>;
-     lesslli=specialize TLess<longint>;
-     sortlli=specialize TOrderingArrayUtils<vectorlli, longint, lesslli>;
-
-type TGSortTest = class(TTestCase)
-  Published
-    procedure SortRandomTest;
-    procedure SortZeroOneTest;
-  public
-    procedure Setup;override;
-  private 
-    data:vectorlli;
-  end;
-
-implementation
-
-procedure TGSortTest.SortRandomTest;
-var i:longint;
-begin
-  for i:=0 to 5000 do
-    data.pushBack(random(10000));
-  sortlli.sort(data, 5001);
-  for i:=0 to 4999 do
-    AssertEquals('Wrong order', false, data[i+1]<data[i]);
-end;
-
-procedure TGSortTest.SortZeroOneTest;
-var i:longint;
-begin
-  for i:=0 to 5000 do
-    data.pushBack(random(2));
-  sortlli.sort(data, 5001);
-  for i:=0 to 4999 do
-    AssertEquals('Wrong order', false, data[i+1]<data[i]);
-end;
-
-procedure TGSortTest.Setup;
-begin
-  data:=vectorlli.create;
-end;
-
-initialization
-  RegisterTest(TGSortTest);
-end.

+ 2 - 2
packages/fcl-stl/tests/run-all-tests

@@ -1,4 +1,4 @@
 #!/bin/bash
-rm *.o *.ppu ../*.o ../*.ppu testrunner
-fpc -Fu.. -gttt testrunner.pp -Sa
+rm *.o *.ppu testrunner
+fpc -Fu../units/x86_64-linux -gttt testrunner.pp -Sa
 ./testrunner --all

+ 2 - 2
packages/fcl-stl/tests/suiteconfig.pp

@@ -19,8 +19,8 @@ unit suiteconfig;
 interface
 
 uses
-  gvectortest, gstacktest, gqueuetest, gdequetest, gsorttest,
-  gpriorityqueuetest, gsettest, gmaptest;
+  gvectortest, gstacktest, gqueuetest, gdequetest, garrayutilstest,
+  gsettest, gmaptest;
 
 implementation