<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>cojack blog &#187; sortowanie tablic</title>
	<atom:link href="http://www.cojack.pl/tag/sortowanie-tablic/feed" rel="self" type="application/rss+xml" />
	<link>http://www.cojack.pl</link>
	<description>Programowanie oraz Open Source powodem do życia</description>
	<lastBuildDate>Sat, 26 Nov 2011 18:43:28 +0000</lastBuildDate>
	<language>PL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Sortowanie tablic</title>
		<link>http://www.cojack.pl/sortowanie-tablic</link>
		<comments>http://www.cojack.pl/sortowanie-tablic#comments</comments>
		<pubDate>Mon, 29 Jun 2009 13:37:32 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[algorytmy sortowania]]></category>
		<category><![CDATA[skrypty php]]></category>
		<category><![CDATA[sortowanie tablic]]></category>
		<category><![CDATA[tablice php]]></category>

		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=73</guid>
		<description><![CDATA[Tym razem chciałbym omówić sortowanie tablic w php, dobrze wszyscy o tym wiemy że php udostępnia nam szereg funkcji do sortowania treści w tablicach, ale nikt nie powiedział że nie możemy napisać swojej prawda? No właśnie, chciałbym opisać najczęściej stosowane algorytmy sortowania, są bardzo praktyczne i często używane w innych ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="PHP" src="http://cojack.os-cms.pl/wp-content/arch-php.png" alt="" width="100" height="100" />Tym razem chciałbym omówić sortowanie tablic w php, dobrze wszyscy o tym wiemy że php udostępnia nam szereg funkcji do sortowania treści w tablicach, ale nikt nie powiedział że nie możemy napisać swojej prawda? No właśnie, chciałbym opisać najczęściej stosowane algorytmy sortowania, są bardzo praktyczne i często używane w innych językach programowania jak chociażby w c++, są to:</p>
<p><a href="#sortowanie_przez_wstawianie">Sortowanie przez wstawianie</a><br />
<a href="#sortowanie_babelkowe">Sortowanie bąbelkowe</a><br />
<a href="#sortowanie_przez_wstrzasanie">Sortowanie przez wstrząsanie</a><br />
<a href="#quicksort">Sortowanie szybkie (Quicksort)</a><br />
<a href="#sortowanie_przez_kopcowanie">Sortowanie przez kopcowanie (Heap Sort)</a><br />
<a href="#sortowanie_przez_scalanie">Sortowanie przez scalanie</a></p>
<p>Na koniec powiemy sobie co nie co o tych sortowaniach. Tak więc zacznijmy</p>
<h3>
<a name="sortowanie_przez_wstawianie">Sortowanie przez wstawianie</a><br />
</h3>
<p>Cytat:</p>
<blockquote><p>
Ciekawa odmiana tego algorytmu realizuje wstawianie poprzez przesuwanie zawartości tablic w prawo o jedno miejsce w celu wytworzenia odpowiedniej luki, w której następnie umieszcza ów element. Skąd mamy wiedzieć, czy kontynuować przesuwanie zawartości tablicy podczas poszukiwania luki? Podjęcie decyzji umożliwi nam sprawdzanie warunku sortowania (sortowanie w kierunku wartości malejących, rosnących, czy też wg innych kryteriów).
</p></blockquote>
<p>Zobaczmy jak wygląda taki algorytm</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> InsertSort<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$n</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$n</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$j</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$i</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 0 i -1 są posortowane</span>
    <span style="color: #000088;">$temp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$j</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&gt;</span><span style="color: #000088;">$temp</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
       <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
       <span style="color: #000088;">$j</span><span style="color: #339933;">--;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #000088;">$temp</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Cytat:</p>
<blockquote><p>Algorytm sortowania przez wstawianie charakteryzuje się dość wysokim kosztem: jest on bowiem klasy <i>O(N<sup>2</sup>)</i>, co eliminuje go w praktyce z sortowania dużych tablic. Niemniej jeśli nie zależy nam na szybkości sortowania, a potrzebujemy algorytm na tyle krótkiego, by się w nim nie pomylić &#8211; to wówczas jest on idealny w swojej niepodważalnej prostocie.</p></blockquote>
<p>Przykład użycia:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$tablica</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">9</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">8</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
InsertSort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tablica</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tablica</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Powinniśmy dostać taki o to rezultat:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">Array
(
    [0] =&gt; 2
    [1] =&gt; 3
    [2] =&gt; 4
    [3] =&gt; 6
    [4] =&gt; 7
    [5] =&gt; 8
    [6] =&gt; 9
    [7] =&gt; 10
)</pre></td></tr></table></div>

<h3>
 <a name="sortowanie_babelkowe">Sortowanie bąbelkowe</a><br />
</h3>
<p>Cytat:</p>
<blockquote><p>Podobnie jak sortowanie przez wstawianie, algorytm sortowania bąbelkowego charakteryzuje się olbrzymią prostotą zapisu. Intrygująca jego nazwa wzięła się z angielskich pęcherzyków powietrza, ulatujących w górę tuby wypełnionej wodą &#8211; i ole postawioną tablicę pionowo w górę potraktować jako pojemnik z wodą, a liczby jako pęcherzyki powietrza. Najszybciej ulatują do góry &#8222;bąbelki&#8221; najlżejsze -liczby o najmniejszej wartości (przyjmując oczywiście że sortowanie w kierunku wartości niemalejących).</p></blockquote>
<p>A teraz trochę kodu</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> BubbleSort<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$n</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$n</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$j</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span><span style="color: #339933;">&gt;=</span><span style="color: #000088;">$i</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span><span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// zmiana $tab[j-1] z $tab[$j]</span>
        <span style="color: #000088;">$tmp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tmp</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Przykład użycia</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$tablica</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">40</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">29</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">18</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
BubbleSort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tablica</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tablica</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Powinniśmy dostać taki o to rezultat:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">Array
(
    [0] =&gt; 2
    [1] =&gt; 4
    [2] =&gt; 6
    [3] =&gt; 18
    [4] =&gt; 20
    [5] =&gt; 29
    [6] =&gt; 40
)</pre></td></tr></table></div>

<p>Analiza algorytmu (miała być tabelka, ale za dużo roboty xD)</p>
<blockquote><p>Przeanalizujmy dokładnie sortowanie bąbelkowe pewnej 7-elementowej tablicy. Tablica jest przemiatana sukcesywnie od dołu do góry (pętla zmiennej $i). Analizowane są zawsze dwa sąsiadujące ze sobą elementy (pętla zmiennej $j): jeśli nie są one uporządkowane (u góry jest element &#8222;cięższy&#8221;), to następuje ich zmiana. W trakcie pierwszego rpzebiegu na pierwszą pozycje tablicy (indeks 0) ulatuje element &#8222;najlżejszy&#8221;, w trakcie drugiego przebiegu drugi najlżejszy element  wędruje na drugą pozycję tablicy (indeks 1) i tak dalej, aż do ostatecznego posortowania tablicy. Strefa pracy algorytmu zmniejsza się zatem o <i>1</i> w kolejny przejściu dużej pętli &#8211; analizowane za każdym razem całej tablicy było by oczywistym marnotrawstwem!</p></blockquote>
<p>Nawet dość pobieżna analiza prowadzi do kilku negatywnych uwag na temat samego algorytmu:</p>
<ul>
<li> dość często zdarzają się &#8222;puste przebiegi&#8221; (nie jest dokonywana żadna wymiana, bowiem elementy są już posortowane);</li>
<li>algorytm jest bardzo wrażliwy na konfigurację danych. Oto przykład dwóch niewiele różniących się tablic, z których pierwsza wymaga jednej zmiany sąsiadujących ze sobą elementów, a druga będzie wymagać ich aż sześciu.
<ol>
<li>4, 2, 6, 18, 20, 39, 40</li>
<li>4, 6, 18, 20, 39, 40, 2</li>
</ol>
</ul>
<p>Istnieje kilka możliwości poprawy jakości tego algorytmu &#8211; nie prowadzą one co prawda do zmiany jego klasy (w dalszym ciągu mamy do czynienia z O(N<sup>2</sup>)), ale mimo to dość znacznie go przyspieszają. Ulepszenia te polegają odpowiednio na:</p>
<ul>
<li>zapamiętywaniu indeksu ostatniej zamiany (walka z &#8222;pustymi przebiegami&#8221;);</li>
<li>przełączaniu kierunków przeglądania tablicy (walka z niekorzystnymi konfiguracjami danych);</li>
</ul>
<p>Tak poprawiony algorytm sortowania bąbelkowego nazwiemy sobie po Polsku sortowaniem poprzez wytrząsanie (ang. shaker-sort).</p>
<h3>
 <a name="sortowanie_przez_wstrzasanie">Sortowanie przez wstrząsanie</a><br />
</h3>
<p>Cały opis tego algorytmu jest zawarty w powyższym pkt + uwzględnione poprawki.</p>
<p>Skrypt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> zmiana<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$tmp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tmp</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> ShakerSort<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$left</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$n</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$right</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$n</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$k</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$n</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">do</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$j</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$right</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span> <span style="color: #339933;">&gt;=</span> <span style="color: #000088;">$left</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span><span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
        zmiana<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$k</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$j</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000088;">$left</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$k</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$j</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$left</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$right</span><span style="color: #339933;">;</span> <span style="color: #000088;">$j</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
          zmiana<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$j</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000088;">$k</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$j</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
      <span style="color: #000088;">$right</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$k</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$left</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$right</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Przykład użycia taki sam jak przy sortowaniu bąbelkowym, powinien dać taki sam rezultat.</p>
<h3>
 <a name="quicksort">Sortowanie szybkie (Quicksort)</a><br />
</h3>
<p>Cytat:</p>
<blockquote><p>Jest to słynny algorytm. Należy od do tych rozwiązań w których poprzez odpowiednią dekompozycję osiągnięty został znacznie zysk szybkości sortowania. Procedura sortowania dzieli się na dwie zasadnicze części: część służącą do właściwego sortowania, która nie robi w zasadzie nic oprócz wywoływania samej siebie, oraz procedury rozdzielania elementów tablicy względem wartości pewnej komórki tablicy służącej za oś (ang. pivot) podziału. Proces sortowania jest dokonywany przez tą właśnie procedurę, natomiast rekurencja zapewnia poskładanie wyników cząstkowych i w konsekwencji posortowanie całej tablicy.</p></blockquote>
<p>Jak dokładnie działa procedura podziału? Otóż w pierwszym momencie odczytuje się wartość elementu osiowego P, którym zazwyczaj jest po prostu pierwszy element analizowanego fragmentu tablicy. Tenże fragment tablic jest następnie dzielony wg klucza symbolicznie podstawionego poniżej:</p>
<table border="1" cellspacing="0">
<tr align="center">
<td width="150px">element < 'P'</td>
<td width="150px">element osiowy &#8216;P&#8217;</td>
<td width="150px">element >= &#8216;P&#8217;</td>
</tr>
</table>
<p>Kolejnym etapem jest zaaplikowanie procedury Quicksort na lewym i prawym fragmencie tablicy, czego efektem będzie jej posortowanie. To wszystko!</p>
<p>Cały pomysł opiera się na zachowaniu dość prostego niezmiennika w aktualnie rozdzielanym fragmencie tablicy</p>
<table border="1" cellspacing="0" >
<tr align="center">
<td width="50px">&#8216;P&#8217;</td>
<td width="50px">< 'P'</td>
<td width="50px">&nbsp;</td>
<td width="100px"> >= &#8216;P&#8217; </td>
<td width="50px">&nbsp;</td>
<td width="100px">Fragment niezbadany</td>
</tr>
<tr>
<td>left</td>
<td colspan="2" align="right">m</td>
<td colspan="2" align="right">i</td>
<td align="right">right</td>
</tr>
</table>
<p></p>
<ul>
Oznaczenia:</p>
<li>left &#8211; lewy skrajny indeks aktualnego fragmentu tablicy;</li>
<li>right &#8211; prawy skrajny indeks aktualnego fragmentu tablicy;</li>
<li>P &#8211; wartość osiowa (zazwyczaj będzie to $tab[$left]);</li>
<li>i &#8211; indeks przechadzający się po indeksach tablicy od left do right;</li>
<li>m &#8211; poszukiwany indeks komórki tablicy, w której umieścimy element osiowy</li>
</ul>
<p>Cytat:</p>
<blockquote><p>Przemieszczanie się po tablicy służy do poukładani jej elementów w taki sposób, aby po lewej stronie <u>m</u>, znajdowały się wartości mniejsze od elementu osiowego, po prawej zaś &#8211; większe lub równe. W tym celu podczas przemieszczania indeksu <u>i</u> sprawdzimy prawdziwość niezmiennika $tab[i] > P. Jeśli jest on fałszywy, to poprzez inkrementację <u>i</u> wymianę wartości $tab[m] i $tab[i] przywracamy porządek. Gdy zakończymy ostatecznie przeglądanie tablicy w pogoni za komórkami, które nie chciały się podporządkować niezmiennikowi, zamiana $tab[$left] i $tab[m] doprowadzi do oczekiwanej sytuacji.</p></blockquote>
<p>Pokażmy teraz jak to działa:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> zmiana<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$tmp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$a</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tmp</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> Quicksort <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$tab</span><span style="color: #339933;">,</span> <span style="color: #000088;">$left</span><span style="color: #339933;">,</span> <span style="color: #000088;">$right</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$left</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$right</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$m</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$left</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$left</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$right</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$left</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
        zmiana<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #339933;">++</span><span style="color: #000088;">$m</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    zmiana<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$left</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$tab</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$m</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Quicksort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #339933;">,</span><span style="color: #000088;">$left</span><span style="color: #339933;">,</span><span style="color: #000088;">$m</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Quicksort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tab</span><span style="color: #339933;">,</span><span style="color: #000088;">$m</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #000088;">$right</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Przykład zastosowania:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$tablica</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">29</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">40</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">18</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">20</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">32</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">23</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">34</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">39</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">41</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$prawa</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tablica</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
Quicksort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tablica</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #000088;">$prawa</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tablica</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Powinniśmy dostać taki o to rezultat:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">Array
(
    [0] =&gt; 1
    [1] =&gt; 2
    [2] =&gt; 6
    [3] =&gt; 18
    [4] =&gt; 20
    [5] =&gt; 23
    [6] =&gt; 29
    [7] =&gt; 32
    [8] =&gt; 34
    [9] =&gt; 39
    [10] =&gt; 40
    [11] =&gt; 41
)</pre></td></tr></table></div>

<p>cdn&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/sortowanie-tablic/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

