<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: lexicographic code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 02:48:50 GMT</pubDate>
    <description>DZone Snippets: lexicographic code</description>
    <item>
      <title>Generate permutations</title>
      <link>http://snippets.dzone.com/posts/show/4632</link>
      <description>Generates all the permutations of {1, 2, ..., n}.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://compprog.wordpress.com/2007/10/08/generating-permutations-2/"&gt;this&lt;/a&gt; for further explanations.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;void printv(int v[], int n) {&lt;br /&gt;	int i;&lt;br /&gt;&lt;br /&gt;	for (i = 0; i &lt; n; i++)&lt;br /&gt;		printf("%d ", v[i]);&lt;br /&gt;	printf("\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*!&lt;br /&gt;	This just swaps the values of a and b&lt;br /&gt;&lt;br /&gt;	i.e if a = 1 and b = 2, after&lt;br /&gt;&lt;br /&gt;		SWAP(a, b);&lt;br /&gt;&lt;br /&gt;	a = 2 and b = 1&lt;br /&gt;*/&lt;br /&gt;#define SWAP(a, b) a = a + b - (b = a)&lt;br /&gt;&lt;br /&gt;/*!&lt;br /&gt;	Generates the next permutation of the vector v of length n.&lt;br /&gt;&lt;br /&gt;	@return 1, if there are no more permutations to be generated&lt;br /&gt;&lt;br /&gt;	@return 0, otherwise&lt;br /&gt;*/&lt;br /&gt;int next(int v[], int n) {&lt;br /&gt;	/* P2 */&lt;br /&gt;	/* Find the largest i */&lt;br /&gt;	int i = n - 2;&lt;br /&gt;	while ((i &gt;= 0) &amp;&amp; (v[i] &gt; v[i + 1]))&lt;br /&gt;		--i;&lt;br /&gt;&lt;br /&gt;	/* If i is smaller than 0, then there are no more permutations. */&lt;br /&gt;	if (i &lt; 0)&lt;br /&gt;		return 1;&lt;br /&gt;&lt;br /&gt;	/* Find the largest element after vi but not larger than vi */&lt;br /&gt;	int k = n - 1;&lt;br /&gt;	while (v[i] &gt; v[k])&lt;br /&gt;		--k;&lt;br /&gt;	SWAP(v[i], v[k]);&lt;br /&gt;&lt;br /&gt;	/* Swap the last n - i elements. */&lt;br /&gt;	int j;&lt;br /&gt;	k = 0;&lt;br /&gt;	for (j = i + 1; j &lt; (n + i) / 2 + 1; ++j, ++k)&lt;br /&gt;		SWAP(v[j], v[n - k - 1]);&lt;br /&gt;&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;	int v[128];&lt;br /&gt;	int n = 3;&lt;br /&gt;&lt;br /&gt;	/* The initial permutation is 1 2 3 ...*/&lt;br /&gt;	/* P1 */&lt;br /&gt;	int i;&lt;br /&gt;	for (i = 0; i &lt; n; ++i)&lt;br /&gt;		v[i] = i + 1;&lt;br /&gt;	printv(v, n);&lt;br /&gt;&lt;br /&gt;	int done = 1;&lt;br /&gt;	do {&lt;br /&gt;		if (!(done = next(v, n)))&lt;br /&gt;			printv(v, n); /* P3 */&lt;br /&gt;	} while (!done);&lt;br /&gt;&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 10 Oct 2007 14:45:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4632</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
  </channel>
</rss>
