| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- IMPLEMENTATION MODULE perms;
- PROCEDURE NextPerm(n:CARDINAL; VAR s:ARRAY OF BYTE;
- VAR wrap:BOOLEAN);
- VAR
- i:CARDINAL; (* s[i-1] is the most significant byte changed *)
- j:CARDINAL; (* s[j] is the byte to be swapped with s[i-1] *)
- tmp:BYTE;
- BEGIN
- IF n = 0 THEN
- wrap := TRUE;
- RETURN;
- END;
- i := n - 1;
- LOOP
- IF i = 0 THEN
- wrap := TRUE;
- EXIT;
- END;
- IF s[i-1] < s[i] THEN
- j := n - 1;
- WHILE s[j] <= s[i-1] DO
- j := j - 1;
- END;
- tmp := s[j]; s[j] := s[i-1]; s[i-1] := tmp; (* swap *)
- wrap := FALSE;
- EXIT;
- END;
- i := i - 1;
- END;
-
- (* s[i]..s[n-1] are in reverse order, reversing them
- yields the minimum permutation we require *)
- j := n - 1;
- WHILE i < j DO
- tmp := s[j]; s[j] := s[i]; s[i] := tmp;
- i := i + 1;
- j := j - 1;
- END;
- END NextPerm;
- END perms.
|