<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BE%D0%BA</id>
		<title>Генерация перестановок - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BE%D0%BA"/>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BE%D0%BA&amp;action=history"/>
		<updated>2026-06-27T06:46:08Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://lib.custis.ru/index.php?title=%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=27291&amp;oldid=prev</id>
		<title>StasFomin в 16:56, 13 июня 2011</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BE%D0%BA&amp;diff=27291&amp;oldid=prev"/>
				<updated>2011-06-13T16:56:56Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;При самом заурядном программировании часто возникает задача генерации всех возможных перестановок некоторого заданного множества - и хотя задача написания этого перебора тривиальна, желательно не изобретать велосипед а пользоваться стандартным алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Во-первых, заметим, что перестановки называются &amp;quot;Permutations&amp;quot;. И можно многое найти по поисковым запросам {{SearchGoogle|Permutations}}&lt;br /&gt;
&lt;br /&gt;
очень хорошее описание алгоритма :&lt;br /&gt;
* http://rain.ifmo.ru/~mikhalev/samples/disarray/disarray.html&lt;br /&gt;
&lt;br /&gt;
При написании программ на C++, разумно использовать STL:&lt;br /&gt;
* http://www.devx.com/tips/Tip/20816&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://hydra.marketsite.ru/dimas/doc/books/programming/shen/node7.html#SECTION00220000000000000000  Описание алгоритма и реализация на Pascal]&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;tt&amp;gt;PL/SQL&amp;lt;/tt&amp;gt; это выглядит примерно так (также долно работать, для перестановок с повторениями):&lt;br /&gt;
&amp;lt;code-oracle8&amp;gt;&lt;br /&gt;
    _public_procedure({get_next_permutation},{&lt;br /&gt;
        _param({a_permutation}, {IN OUT NOCOPY pk_cmn.TStringArray},{},{Перестановка - массив &lt;br /&gt;
                                                                        строк индексируемый с 1&lt;br /&gt;
                                                                        без пропусков})&lt;br /&gt;
        },{Получить следующую перестановку в лексикографическом порядке. &lt;br /&gt;
           Если перестановка на входе последняя - то возвращается пустой массив&lt;br /&gt;
          (a_permutation.first IS NULL)  },&lt;br /&gt;
      {&lt;br /&gt;
      AS&lt;br /&gt;
        l_i PLS_INTEGER;&lt;br /&gt;
        l_j PLS_INTEGER;&lt;br /&gt;
        PROCEDURE swap(l_i PLS_INTEGER, l_j PLS_INTEGER) AS&lt;br /&gt;
        l_val VARCHAR2(4000);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          l_val:=a_permutation(l_i);&lt;br /&gt;
          a_permutation(l_i):=a_permutation(l_j);&lt;br /&gt;
          a_permutation(l_j):=l_val;  &lt;br /&gt;
        END;&lt;br /&gt;
      BEGIN&lt;br /&gt;
        l_i:=a_permutation.count-1;&lt;br /&gt;
        -- поиск l_i&lt;br /&gt;
        WHILE (l_i&amp;gt;0)and(a_permutation(l_i)&amp;gt;=a_permutation(l_i+1)) LOOP l_i:=l_i-1; END LOOP;&lt;br /&gt;
        IF l_i&amp;gt;0 THEN&lt;br /&gt;
            l_j:=l_i+1;&lt;br /&gt;
            --поиск l_j&lt;br /&gt;
            WHILE (l_j&amp;lt;a_permutation.count)and(a_permutation(l_j+1)&amp;gt;a_permutation(l_i)) LOOP            &lt;br /&gt;
                 l_j:=l_j+1; &lt;br /&gt;
            END LOOP;&lt;br /&gt;
            -- меняем l_i и l_j&lt;br /&gt;
            swap(l_i,l_j);&lt;br /&gt;
            ---  переставляем  в обратном порядке от l_i до конца&lt;br /&gt;
            FOR l_j IN l_i+1 .. TRUNC((a_permutation.count+l_i)/2) loop &lt;br /&gt;
              Swap(l_j,a_permutation.count-l_j+l_i+1);&lt;br /&gt;
            END LOOP;&lt;br /&gt;
        ELSE &lt;br /&gt;
            a_permutation.Delete;&lt;br /&gt;
        END IF;&lt;br /&gt;
      END;&lt;br /&gt;
      },{})&lt;br /&gt;
&amp;lt;/code-oracle8&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Алгоритмы]]&lt;br /&gt;
{{replicate-from-custiswiki-to-lib}}&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	</feed>