PERMS.MOD 953 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. IMPLEMENTATION MODULE perms;
  2. PROCEDURE NextPerm(n:CARDINAL; VAR s:ARRAY OF BYTE;
  3. VAR wrap:BOOLEAN);
  4. VAR
  5. i:CARDINAL; (* s[i-1] is the most significant byte changed *)
  6. j:CARDINAL; (* s[j] is the byte to be swapped with s[i-1] *)
  7. tmp:BYTE;
  8. BEGIN
  9. IF n = 0 THEN
  10. wrap := TRUE;
  11. RETURN;
  12. END;
  13. i := n - 1;
  14. LOOP
  15. IF i = 0 THEN
  16. wrap := TRUE;
  17. EXIT;
  18. END;
  19. IF s[i-1] < s[i] THEN
  20. j := n - 1;
  21. WHILE s[j] <= s[i-1] DO
  22. j := j - 1;
  23. END;
  24. tmp := s[j]; s[j] := s[i-1]; s[i-1] := tmp; (* swap *)
  25. wrap := FALSE;
  26. EXIT;
  27. END;
  28. i := i - 1;
  29. END;
  30. (* s[i]..s[n-1] are in reverse order, reversing them
  31. yields the minimum permutation we require *)
  32. j := n - 1;
  33. WHILE i < j DO
  34. tmp := s[j]; s[j] := s[i]; s[i] := tmp;
  35. i := i + 1;
  36. j := j - 1;
  37. END;
  38. END NextPerm;
  39. END perms.
  40.