<?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"
	>

<channel>
	<title>Konrad Szczęśniak - IT Blog</title>
	<atom:link href="http://koszcz.pchteam.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://koszcz.pchteam.com</link>
	<description>Blog poświęcony moim doświadczeniom związanym z programowaniem, grafiką 3d oraz poświęcony różnym dziedzinom informatyki.</description>
	<pubDate>Mon, 02 Jun 2008 20:29:47 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Chłopaki zrobili drzewa AVL</title>
		<link>http://koszcz.pchteam.com/2008/06/drzewa-avl/</link>
		<comments>http://koszcz.pchteam.com/2008/06/drzewa-avl/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 20:29:47 +0000</pubDate>
		<dc:creator>Konrad Szczęśniak</dc:creator>
		
		<category><![CDATA[Programowanie]]></category>

		<category><![CDATA[ansi c]]></category>

		<category><![CDATA[avl]]></category>

		<category><![CDATA[bst]]></category>

		<category><![CDATA[drzewa]]></category>

		<category><![CDATA[wit]]></category>

		<category><![CDATA[wsisiz]]></category>

		<category><![CDATA[wyszukiwanie binarne]]></category>

		<guid isPermaLink="false">http://koszcz.pchteam.com/?p=15</guid>
		<description><![CDATA[Wiem, miałem zrobić drzewa BST a potem AVL, ale po pokazie na dzisiejszym wykładzie chyba nie warto. Chłopaki z uczelni wybrali sobie projekt z podstaw programowania i wykonali kawał dobrej roboty. Ogólnie rzecz biorąc poza zwykłą implementacją drzew AVL przygotowali programik pozwalający dowolnie modyfikować drzewo, wyniki pracy zapisywać do pliku razem z całą historią zmian [...]]]></description>
			<content:encoded><![CDATA[<p>Wiem, miałem zrobić drzewa BST a potem AVL, ale po pokazie na dzisiejszym wykładzie chyba nie warto. Chłopaki z uczelni wybrali sobie projekt z podstaw programowania i wykonali kawał dobrej roboty. Ogólnie rzecz biorąc poza zwykłą implementacją drzew AVL przygotowali programik pozwalający dowolnie modyfikować drzewo, wyniki pracy zapisywać do pliku razem z całą historią zmian oraz przeglądać je w trybie tekstowym oraz w SVG. Programik ma więcej funkcji, ale o tym dowiecie się wchodząc na stronę internetową projektu gdzie możecie wszystko pobrać, przeczytać dokumentację oraz w razie czego skontaktować się z autorami.</p>
<p><a href="http://avl.ansi-c.pl/" target="_blank">http://avl.ansi-c.pl/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://koszcz.pchteam.com/2008/06/drzewa-avl/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sterowniki do NVIDII oraz tapetki</title>
		<link>http://koszcz.pchteam.com/2008/05/sterowniki-do-nvidii-oraz-tapetki/</link>
		<comments>http://koszcz.pchteam.com/2008/05/sterowniki-do-nvidii-oraz-tapetki/#comments</comments>
		<pubDate>Fri, 30 May 2008 22:47:47 +0000</pubDate>
		<dc:creator>Konrad Szczęśniak</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[fedora]]></category>

		<category><![CDATA[kmod-nvidia]]></category>

		<category><![CDATA[livna]]></category>

		<category><![CDATA[nvidia]]></category>

		<category><![CDATA[sterowniki]]></category>

		<category><![CDATA[tapety]]></category>

		<guid isPermaLink="false">http://koszcz.pchteam.com/?p=14</guid>
		<description><![CDATA[Witam, po kilku tygodniach oczekiwania doczekaliśmy się sterowników do kart graficznych firmy NVIDIA dla Fedory 9. Jak zwykle są one dostępne w repozytorium livny (jeśli ktoś nie ma tego repo to odsyłam tutaj http://rpm.livna.org/rlowiki/), a instalacja jak zwykle nie powinna nikomu sprawić problemów.
yum install kmod-nvidia
Wpisanie tego polecenia w konsoli z prawami root&#8217;a powinno wszystko załatwić.
Idąc [...]]]></description>
			<content:encoded><![CDATA[<p>Witam, po kilku tygodniach oczekiwania doczekaliśmy się sterowników do kart graficznych firmy NVIDIA dla Fedory 9. Jak zwykle są one dostępne w repozytorium livny (jeśli ktoś nie ma tego repo to odsyłam tutaj <a href="http://rpm.livna.org/rlowiki/" target="_blank">http://rpm.livna.org/rlowiki/</a>), a instalacja jak zwykle nie powinna nikomu sprawić problemów.<br />
<code>yum install kmod-nvidia</code><br />
Wpisanie tego polecenia w konsoli z prawami root&#8217;a powinno wszystko załatwić.</p>
<p>Idąc za ciosem postanowiłem zainstalować pakiet compiz-fusion oraz ustawić odpowiedni motyw, ostatnią rzeczą do zrobienia było wybranie panoramicznej tapetki. Muszę przyznać iż google naprawdę się postarało i tym oto sposobem chciałbym polecić wszystkim dwie świetne witryny z masą wspaniałych tapet.</p>
<p><a href="http://wallpaperstock.net/" target="_blank">http://wallpaperstock.net/</a></p>
<p><a href="http://interfacelift.com/" target="_blank">http://interfacelift.com/</a></p>
<p>Szkoda że nie można mieć ich wszystkich na pulpicie ;d</p>
]]></content:encoded>
			<wfw:commentRss>http://koszcz.pchteam.com/2008/05/sterowniki-do-nvidii-oraz-tapetki/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Nowa Fedora Core 9 Sulphur</title>
		<link>http://koszcz.pchteam.com/2008/05/nowa-fedora-core-9-sulphur/</link>
		<comments>http://koszcz.pchteam.com/2008/05/nowa-fedora-core-9-sulphur/#comments</comments>
		<pubDate>Thu, 22 May 2008 17:18:03 +0000</pubDate>
		<dc:creator>Konrad Szczęśniak</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[core]]></category>

		<category><![CDATA[fedora]]></category>

		<category><![CDATA[instalacja]]></category>

		<category><![CDATA[sulphur]]></category>

		<guid isPermaLink="false">http://koszcz.pchteam.com/?p=13</guid>
		<description><![CDATA[Jak wiadomo niedawno temu na świat wyszła wersja finalna nowe Fedory Core oznaczona numerkiem 9. Wczoraj zrobiłem sobie aktualizację i pierwszą rzeczą która pozytywnie mnie zaskoczyła był w końcu normalny manager logowania oraz wbudowany Firefox w wersji 3b5 (naprawdę świetna rzecz), a poza tym bez fajerwerków. Niestety na livnie nie ma jeszcze sterowników dla kart [...]]]></description>
			<content:encoded><![CDATA[<p>Jak wiadomo niedawno temu na świat wyszła wersja finalna nowe Fedory Core oznaczona numerkiem 9. Wczoraj zrobiłem sobie aktualizację i pierwszą rzeczą która pozytywnie mnie zaskoczyła był w końcu normalny manager logowania oraz wbudowany Firefox w wersji 3b5 (naprawdę świetna rzecz), a poza tym bez fajerwerków. Niestety na livnie nie ma jeszcze sterowników dla kart graficznych NVIDII (w tym mojego GeForce&#8217;a). Jeśli ktoś ma ochotę zainstalować tą wersję to polecam ciekawą stronkę stworzoną przez osobę o imieniu Mauriat Miranda, który to opisał wszystkie poinstalacyjne procedury przydatne do normalnego funkcjonowania Fedory 9. Można tam mniej więcej znaleźć info o tym jak zainstalować kodeki, aplikacje multimedialne, skonfigurować sambę itp.</p>
<p><a href="http://www.mjmwired.net/resources/mjm-fedora-f9.html">http://www.mjmwired.net/resources/mjm-fedora-f9.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://koszcz.pchteam.com/2008/05/nowa-fedora-core-9-sulphur/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kilka dodatkowych działów</title>
		<link>http://koszcz.pchteam.com/2008/05/kilka-dodatkowych-dzialow/</link>
		<comments>http://koszcz.pchteam.com/2008/05/kilka-dodatkowych-dzialow/#comments</comments>
		<pubDate>Thu, 01 May 2008 14:25:07 +0000</pubDate>
		<dc:creator>Konrad Szczęśniak</dc:creator>
		
		<category><![CDATA[Bez kategorii]]></category>

		<category><![CDATA[grafika 3d]]></category>

		<category><![CDATA[Programowanie]]></category>

		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.pchteam.com/koszcz/?p=12</guid>
		<description><![CDATA[Dzisiaj uaktualniłem bloga i kilka dodatkowych stron.

Grafika 3D jest działem, w którym przedstawiłem kilka swoich prac wykonanych w programie Zanoza Modeler z czasów gdy jeszcze zajmowałem się tworzeniem dodatkowych samochodów do serii Grand Theft Auto.
Programowanie zawiera listę wpisów związanych z programowaniem wraz z krótkim opisem.
W dziale Webdesign znajdziecie kilka przykładów layoutów, które wykonałem z nudów, [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj uaktualniłem bloga i kilka dodatkowych stron.</p>
<ol>
<li>Grafika 3D jest działem, w którym przedstawiłem kilka swoich prac wykonanych w programie Zanoza Modeler z czasów gdy jeszcze zajmowałem się tworzeniem dodatkowych samochodów do serii Grand Theft Auto.</li>
<li>Programowanie zawiera listę wpisów związanych z programowaniem wraz z krótkim opisem.</li>
<li>W dziale Webdesign znajdziecie kilka przykładów layoutów, które wykonałem z nudów, jednak nie są one brane przeze mnie poważnie, raczej jako zabawa z photoshopem.</li>
</ol>
<p>Niedługo zamierzam napisać trochę o drzewach BST jako wstęp do ich specyficznej, ale za to jak świetnej, odmiany AVL. Wyjaśnię tylko że drzewa AVL są zrównoważonymi drzewami BST za pomocą których wyszukiwanie elementu w pesymistycznym przypadku wynosi 1.44logN, w przeciwieństwie do drzew BST gdzie wynik jest niestety liniowy.</p>
<p>Pozdrawiam</p>
]]></content:encoded>
			<wfw:commentRss>http://koszcz.pchteam.com/2008/05/kilka-dodatkowych-dzialow/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problem skoczka szachowego</title>
		<link>http://koszcz.pchteam.com/2008/04/problem-skoczka-szachowego/</link>
		<comments>http://koszcz.pchteam.com/2008/04/problem-skoczka-szachowego/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 18:27:11 +0000</pubDate>
		<dc:creator>Konrad Szczęśniak</dc:creator>
		
		<category><![CDATA[Programowanie]]></category>

		<category><![CDATA[droga]]></category>

		<category><![CDATA[goniec]]></category>

		<category><![CDATA[problem]]></category>

		<category><![CDATA[rekurencja]]></category>

		<category><![CDATA[skoczek]]></category>

		<category><![CDATA[szachy]]></category>

		<guid isPermaLink="false">http://www.pchteam.com/koszcz/?p=8</guid>
		<description><![CDATA[Witam, tym razem chcę przybliżyć wam jeden z podstawowych problemów szachowych wykorzystywanych w informatyce. Zajmiemy się bowiem problemem skoczka szachowego (skoczek jest jedną z figur szachowych). Jest to typowy przykład zastosowania algorytmu z powrotami, dokładny opis i implementacja rozwiązania znajduje się w dalszej części artykułu.

Opis problemu
Skoczek jest takim typem figury, którego ruch wykonujemy poruszając się [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm;">Witam, tym razem chcę przybliżyć wam jeden z podstawowych problemów szachowych wykorzystywanych w informatyce. Zajmiemy się bowiem problemem skoczka szachowego (skoczek jest jedną z figur szachowych). Jest to typowy przykład zastosowania algorytmu z powrotami, dokładny opis i implementacja rozwiązania znajduje się w dalszej części artykułu.</p>
<p><span id="more-8"></span></p>
<h3>Opis problemu</h3>
<p style="margin-bottom: 0cm;">Skoczek jest takim typem figury, którego ruch wykonujemy poruszając się dwa pola dalej na poziomej lub pionowej osi, a następnie wykonujemy przesunięcie o jedno pole po tej drugiej osi. Innymi słowy bardziej przystępny będzie typowy obrazek przedstawiający wszystkie możliwe ruchy skoczka.</p>
<table>
<tr>
<td></td>
<td>8</td>
<td></td>
<td>1</td>
<td></td>
</tr>
<tr>
<td>7</td>
<td></td>
<td></td>
<td></td>
<td>2</td>
</tr>
<tr>
<td></td>
<td></td>
<td>S</td>
<td></td>
<td></td>
</tr>
<tr>
<td>6</td>
<td></td>
<td></td>
<td></td>
<td>3</td>
</tr>
<tr>
<td></td>
<td>5</td>
<td></td>
<td>4</td>
<td></td>
</tr>
</table>
<p>Wszystkich możliwych ruchów, jak widać na obrazku powyżej, jest 8. Sam opis problemu jest prosty, a mianowicie jak przejść skoczkiem po całej szachownicy pojawiając się na każdym z pól tylko jeden raz?</p>
<p>Rozwiązanie tego problemu jest dosyć proste w zrozumieniu oraz, jeśli znamy ideę działania algorytmów z powrotami(jeśli nie to nie martwcie się, postaram się to wyjaśnić w dalszej części artykułu), w implementacji.</p>
<p>Chodzi w uogólnieniu o sprawdzanie każdej drogi jaką możemy przejść korzystając z dostępnych dla skoczka ruchów. Ideę algorytmów z powrotami możemy porównać do sytuacji gdy jakiś niewdzięcznik wsadził nas do labiryntu, a przy sobie mamy tylko jakąś nitkę i przykładowo młotek z gwoźdźmi. Przez chwilę zastanawiamy się jak efektywnie znaleźć drogę do wyjścia nie biegając w kółko i wchodząc w byle jakie korytarze. Po chwili namysłu przybijamy jeden koniec naszej nitki w miejscu z którego zaczęliśmy i umawiamy się że w przypadku pojawienia się rozdroża (nasz tunel w pewnym miejscu rozbiega się na kilka innych tuneli) wybieramy tunel zgodnie z ruchem wskazówek zegara, a w przypadku natrafienia na ślepy zaułek cofamy się do ostatniego rozdroża i wybieramy kolejną drogę, gdy okaże się że wszystkie rozgałęzienia w danym rozdrożu są ślepymi zaułkami cofamy się jeszcze bardziej i tak cały czas aż uda nam się wyjść i przetrzepać naszego niewdzięcznika. Innymi słowy prosta recepta do celu.</p>
<p>Podobnie postąpimy z problemem skoczka rozdrożem będzie każde pole szachownicy, ale zamiast przechodzić z niego na następne, chodzić będziemy po 8 możliwych dla każdego pola (jak można wywnioskować z tabeli dostępnych ruchów. Cofać będziemy się gdy miejsce na które chcemy przejść będzie poza obszarem szachownicy lub będzie oznaczone jako takie na którym już wcześniej stał nasz skoczek. W końcowym rezultacie znajdziemy się na ostatnim wolnym polu na szachownicy dzięki czemu rozwiążemy zadanie.</p>
<p>Do rozwiązania problemu posłużymy się jedną funkcją, którą będziemy wywoływać rekurencyjnie z różnymi parametrami. Każdy ruch będziemy numerować, po pierwsze aby było można odtworzyć trasę skoczka korzystając z tablicy dwuwymiarowej, w której to wartością danego pola będzie numer ruchu w którym skoczek je odwiedził, a zero jeśli pole nie zostało jeszcze odwiedzone. Po drugie w końcowym momencie algorytmu zdarzy się sytuacja gdy skoczek będzie w ostatnim miejscu i nie będzie już możliwości ruchu bo ukończyliśmy zadanie, w tym wypadku dzięki informacji o numerze ruchu możemy zwrócić informację o poprawnym zakończeniu algorytmu. Sama funkcja będzie zwracać 0 jeśli wszystko przebiegło pomyślnie lub 1 jeśli musimy powrócić z jakiegoś miejsca i szukać dalej. Teraz uwaga, w związku z konfliktem nazw numer ruchu jako numer aktualnego posunięcia skoczka to nrRuchu, a numer ruchu jako numer jednej z 8 możliwości ruchu skoczka to nrPrzesunięcia. Wartości przesunięć będziemy przechowywać w tablicy dwuwymiarowej 8&#215;2 gdzie pierwszy indeks to nr przesunięcia, a drugi do index osi po której się poruszamy (dla lepszej organizacji kodu lepiej zrobić własną strukturę, ale akurat tutaj postanowiłem nie wprowadzać tego). W praktyce wygląda to tak:</p>
<p><code>ruchy[0][0]=-2; ruchy[0][1]=1;<br />
ruchy[1][0]=-1; ruchy[1][1]=2;<br />
ruchy[2][0]=1; ruchy[2][1]=2;<br />
ruchy[3][0]=2; ruchy[3][1]=1;<br />
ruchy[4][0]=2; ruchy[4][1]=-1;<br />
ruchy[5][0]=1; ruchy[5][1]=-2;<br />
ruchy[6][0]=-1; ruchy[6][1]=-2;<br />
ruchy[7][0]=-2; ruchy[7][1]=-1;</code></p>
<p>Jak widać do określenia jednego przesunięcia potrzebne są nam dwie wartości, teraz kod naszej głównej funkcji w języku ANSI C:</p>
<p><code>int Ruch(int nrRuchu, int wspX, int wspY) {<br />
int NastWspX,NastWspY,nrPrzesuniecia=-1;<br />
do {<br />
nrPrzesuniecia++;<br />
NastWspX=wspX+ruchy[nrPrzesuniecia][0];<br />
NastWspY=wspY+ruchy[nrPrzesuniecia][1];<br />
if(NastWspX&gt;=0&amp;&amp;NastWspX=0&amp;&amp;NastWspY<br />
if(tablica[NastWspX][NastWspY]==0) {<br />
tablica[NastWspX][NastWspY]=nrRuchu;<br />
if(nrRuchu<br />
if(Ruch(nrRuchu+1,NastWspX,NastWspY)==0) return 0;<br />
else tablica[NastWspX][NastWspY]=0;<br />
} else return 0;<br />
}<br />
}<br />
} while(nrPrzesuniecia!=8);<br />
return 1;<br />
}</code></p>
<p>Jak widać argumentami naszej funkcji są aktualna pozycja skoczka oraz numer aktualnego ruchu(uwaga: szerokosc i wysokosc sa zmiennymi globalnymi), obliczamy w prosty sposób wartość kolejnej współrzędnej oraz sprawdzamy czy pole o takich współrzędnych znajduje się w obrębie tablicy oraz czy nie było odwiedzone wcześniej, w przypadku gdy któreś z tych warunków jest niespełniony następuje wyjście z pętli if i wykonanie pętli while kolejny raz, w przypadku gdy każdy z 8 dostępnych dla nas ruchów był niewypałem funkcja zwraca wartość 1 co oznacza że z tego pola nie da się iść dalej w takiej konfiguracji poprzednich ruchów. Jednak w przypadku gdy jakieś pole jest wolne to stawiamy na nie naszego skoczka i sprawdzamy czy to przypadkiem już nie koniec, jeśli to nasz ostatni ruch (a wiemy że liczba ruchów potrzebnych do przejścia szachownicy wynosi szerkosc szachownicy razy jej wysokosc) to zwrazamy wartość 0. Został nam jeszcze do omówienia najgłębszy element, w pętli if wywołujemy funkcję Ruch z nowymi parametrami i czekamy na jej wynik, jeśli zwróci 1 to jak już wiemy oznacza ślepy zaułek, po czym odznaczamy miejsce które oznaczyliśmy wcześniej i wywołujemy kolejny przebieg pętli while, która sprawdzi kolejną możliwość, jeśli jednak dostaniemy 0 to szczęśliwi informacją o powodzeniu naszej misji zwracamy 0 poprzednim wywołaniom funkcji. Tym oto sposobem rozwiązaliśmy problem, a dzięki tablicy z wartościami pól łatwo odtworzymy wybraną trasę.</p>
<p>Na koniec spora uwaga, a właściwie to dwie. Po pierwsze w przykładzie użyliśmy szachownicy o dowolnym rozmiarze, ale nie dla każdej tablicy istnieje rozwiązanie, przykładowo zróbcie na kartce tescik dla tablicy 3&#215;3. Wniosek? Po prostu się nie da. Po drugie uważajcie na rozmiar tablicy oraz punkt startowy, który tutaj też jest dowolny, jako że algorytm jest typowo brutalny (brute-force) w pewnych przypadkach, albo przy dużej szachownicy albo przy niefortunnym wybraniu punktu startowego, może liczyć się baaardzo długo albo nawet i „wiecznie” mimo waszych nowiusieńkich CoreQuad.</p>
<p>Mam nadzieję że na tym przykładzie zrozumieliście ideę algorytmów z powrotami, w razie jakichś pytań proszę słać je na mail lub lepiej zostawić tutaj w komentarzu. To by było na tyle&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://koszcz.pchteam.com/2008/04/problem-skoczka-szachowego/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quicksort na stosie</title>
		<link>http://koszcz.pchteam.com/2008/04/quicksort-na-stosie/</link>
		<comments>http://koszcz.pchteam.com/2008/04/quicksort-na-stosie/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 14:32:14 +0000</pubDate>
		<dc:creator>Konrad Szczęśniak</dc:creator>
		
		<category><![CDATA[Programowanie]]></category>

		<category><![CDATA[algorytm]]></category>

		<category><![CDATA[bez rekurencji]]></category>

		<category><![CDATA[iteracyjnie]]></category>

		<category><![CDATA[quicksort]]></category>

		<category><![CDATA[szybkie sortowanie]]></category>

		<guid isPermaLink="false">http://www.pchteam.com/koszcz/?p=7</guid>
		<description><![CDATA[Jako zadanie dodatkowe na Podstawach Programowania była możliwość zrobienia algorytmu szybkiego sortowania w wersji iteracyjnej opartej na strukturze stosu. Celem takiego zabiegu jest usunięcie wielu wywołań rekurencyjnych funkcji sortującej.  Implementacja oraz zasada działania znajduje się w dalszej części artykułu.
Standardowy QuickSort w ANSI C wygląda tak:
void quicksort(int *tab, int left, int right) {int i,j;
int x;
x [...]]]></description>
			<content:encoded><![CDATA[<p>Jako zadanie dodatkowe na Podstawach Programowania była możliwość zrobienia algorytmu szybkiego sortowania w wersji iteracyjnej opartej na strukturze stosu. Celem takiego zabiegu jest usunięcie wielu wywołań rekurencyjnych funkcji sortującej.  Implementacja oraz zasada działania znajduje się w dalszej części artykułu.<span id="more-7"></span></p>
<p>Standardowy QuickSort w ANSI C wygląda tak:</p>
<p><code>void quicksort(int *tab, int left, int right) {int i,j;<br />
int x;<br />
x = tab[(left+right)/2];<br />
i=left;<br />
j=right;<br />
do {<br />
while(tab[i]&lt;x) ++i;<br />
while(tab[j]&gt;x) &#8211;j;<br />
if(i&lt;=j) {<br />
int tmp;<br />
tmp = tab[i];<br />
tab[i] = tab[j];<br />
tab[j] = tmp;<br />
++i;<br />
&#8211;j;<br />
}<br />
} while(i&lt;j);<br />
if(left&lt;j) quicksort(tab,left,j);<br />
if(right&gt;i) quicksort(tab,i,right);<br />
}</code></p>
<p>Nie będę tłumaczył kodu zwykłego QuickSorta, gdyż można go znaleść chociażby na wikipedii. Jak widać w ostatnich linijkach znajdują się wywołania rekurencyjne funkcji, by je zlikwidować użyjemy prostej struktury stosu.</p>
<h3>Zasada działania</h3>
<p>Gdy wywołamy pierwszy raz główną funkcję programu po ciągu instrukcji ta sama funkcja wywoła siebie dwa razy i będzie dalej działała na dwóch mniejszych fragmentach tablicy, które później znowu zostaną podzielone. W tym wypadku każda z tych dwóch części jest od siebie niezależna (tzn. działając na jednej nie obchodzi nas co jest w drugiej). Idąc dalej tym tropem możemy odłożyć sobie sortowanie jednej części i pozostać w tej drugiej.</p>
<p>W przypadku naszego programu cały algorytm obejmiemy pętelką while, która będzie się wykonywać do czasu aż na naszym stosie zabraknie danych do obróbki. Sam element stosu będzie zawierał początkowy i końcowy indeks części która ma być później przerobiona.</p>
<p>Zabierzmy się zatem do realizacji stosu, użyjemy tu 3 funkcji: pop służącej do zdejmowania elementu ze stosu, push dzięki której będziemy odkładać elementy na stos i funkcji czyPusty zwracającej 0 jeśli stos jest pusty lub 1 jeśli coś znajduje się na nim.</p>
<p>Element stosu zdefiniujemy tak:</p>
<p><code>struct stos {<br />
int lewyIndeks;<br />
int prawyIndeks;<br />
struct stos *nast;<br />
};</code></p>
<p>Zainicjalizujemy wskaźnik globalny trzymający adres szczytowego elementu stosu</p>
<p><code>struct stos *glowa=NULL;</code></p>
<p>I zajmiemy się definicją funkcji stosowych</p>
<p><code>int czyPusty() {<br />
if(glowa==NULL) return 0;<br />
else return 1;<br />
}</code></p>
<p>Oczywiście stos jest pusty tylko wtedy gdy wskaźnik glowa jest równy wartości NULL</p>
<p><code>void push(int lewy, int prawy) {<br />
struct stos *tmp;<br />
tmp = (struct stos *)malloc(sizeof(struct stos));<br />
tmp-&gt;lewyIndeks=lewy;<br />
tmp-&gt;prawyIndeks=prawy;<br />
if(glowa==NULL) tmp-&gt;nast=NULL;<br />
else tmp-&gt;nast=glowa;<br />
glowa=tmp;<br />
}</code></p>
<p>Alokujemy miejsce w pamięci na nowy element, przypisujemy mu odpowiednie wartości, a następnie wrzucamy go na stos.</p>
<p><code>void pop(int *lewy, int *prawy) {<br />
*lewy=glowa-&gt;lewyIndeks;<br />
*prawy=glowa-&gt;prawyIndeks;<br />
struct stos *tmp;<br />
tmp=glowa;<br />
glowa=glowa-&gt;nast;<br />
free(tmp);<br />
}</code></p>
<p>Tutaj wysyłamy wartości szczytowego elementu stosu do zmiennych podanych w argumentach funkcji oraz usuwamy szczytowy element ze stosu.</p>
<p>Mający wszystkie niezbędne funkcji należy tylko zmodyfikować funkcję sortującą</p>
<p><code>void quicksort(int *tab) {<br />
int i,j,lewy,prawy;<br />
int x;<br />
while(czyPusty()==1) {<br />
pop(&amp;lewy,&amp;prawy);<br />
x = tab[(lewy+prawy)/2];<br />
i=lewy;<br />
j=prawy;<br />
do {<br />
while(tab[i]&lt;x) ++i;<br />
while(tab[j]&gt;x) &#8211;j;<br />
if(i&lt;=j) {<br />
int tmp;<br />
tmp = tab[i];<br />
tab[i] = tab[j];<br />
tab[j] = tmp;<br />
++i;<br />
&#8211;j;<br />
}<br />
} while(i&lt;j);<br />
if(prawy&gt;i) push(i,prawy);<br />
if(lewy&lt;j) push(lewy,j);<br />
}<br />
}</code></p>
<p>Jak widzimy na początku pętli while zamiast pobierać wartości lewy i prawy z argumentów funkcji pobieramy je ze stosu, a na końcu tej samej pętli zamiast wywoływać rekurencyjnie funkcję z innymi parametrami to odkładamy je na stos.</p>
<p>Przed uruchomieniem funkcji należy odłożyć na stos krańcowe indeksy tablicy, którą chcemy posortować.</p>
]]></content:encoded>
			<wfw:commentRss>http://koszcz.pchteam.com/2008/04/quicksort-na-stosie/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Witam</title>
		<link>http://koszcz.pchteam.com/2008/04/powitanie/</link>
		<comments>http://koszcz.pchteam.com/2008/04/powitanie/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 13:14:17 +0000</pubDate>
		<dc:creator>Konrad Szczęśniak</dc:creator>
		
		<category><![CDATA[Bez kategorii]]></category>

		<category><![CDATA[blog]]></category>

		<category><![CDATA[konrad]]></category>

		<category><![CDATA[pierwszy wpis]]></category>

		<category><![CDATA[szczęśniak]]></category>

		<guid isPermaLink="false">http://www.pchteam.com/koszcz/?p=3</guid>
		<description><![CDATA[Witam wszystkich na moim nowo otwartym blogu, na którym będe publikował różnego rodzaju artykuły związane z szeroko pojętą informatyką, szczególnie będą to jakieś zaliczenia, ćwiczenia i projekty szkole oraz te rzeczy które robię hobbystycznie. Mam nadzieję, że w najbliższym czasie znajdziecie tu chociażby garstkę ciekawych dla was informacji.
Pozdrawiam Konrad Szczęśniak
]]></description>
			<content:encoded><![CDATA[<p>Witam wszystkich na moim nowo otwartym blogu, na którym będe publikował różnego rodzaju artykuły związane z szeroko pojętą informatyką, szczególnie będą to jakieś zaliczenia, ćwiczenia i projekty szkole oraz te rzeczy które robię hobbystycznie. Mam nadzieję, że w najbliższym czasie znajdziecie tu chociażby garstkę ciekawych dla was informacji.</p>
<p>Pozdrawiam Konrad Szczęśniak</p>
]]></content:encoded>
			<wfw:commentRss>http://koszcz.pchteam.com/2008/04/powitanie/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
