Wstęp Sortowanie bąbelkowe - lukasz

Transkrypt

Wstęp Sortowanie bąbelkowe - lukasz
Plik pobrano z www.lukasz-socha.pl
Ostatnia aktualizacja: 22.06.2011
Wstęp
Sortowanie jest jedną z najbardziej istotnych funkcji w różnego rodzaju systemach informatycznych
– również w aplikacjach internetowych, gdzie często jest wymagany określony porządek danych
wyświetlanych użytkownikowi. Mimo, że istnieje wbudowana funkcja sort() wykorzystująca
algorytm quicksort warto znać inne algorytmy rozwiązujące ten problem. W cyklu artykułów
przedstawię kilka najbardziej znanych i najczęściej używanych algorytmów sortowania. Na
początek zaprezentuję najprostsze algorytmy o złożoności czasowej O(n2). W kolejnych częściach
omówię bardziej rozbudowane algorytmy o mniejszej złożoności, aż dojdziemy do sposobów
sortowania o złożoności czasowej O(n).
Sortowanie bąbelkowe
Sortowanie bąbelkowe (ang. Bubble sort) polega na porównywaniu dwóch kolejnych elementów i
zamianie ich kolejności, jeżeli zaburza ona porządek, w jakim sortuje się tablicę. Sortowanie
kończy się, gdy podczas kolejnego przejścia nie dokonano żadnej zmiany. Jest to przykład
algorytmu sortowania stabilnego.
Materiał przeznaczony tylko do własnego użytku. Publikacja na innych stronach wyłącznie za zgodą autora.
[email protected]
1/9
Plik pobrano z www.lukasz-socha.pl
Ostatnia aktualizacja: 22.06.2011
Idea
W sortowaniu bąbelkowym przeglądamy listę porównując ze sobą kolejne pary elementów:
pierwszy z drugim, drugi z trzecim, trzeci z czwartym itd. W sytuacji gdy dany element jest
większy od następnego zamieniamy je pozycjami. Powyższą operację powtarzamy n razy. W
każdym kolejnym cyklu przeglądamy o 1 element mniej (jest on już posortowany).
Posortujemy tablicę 4-elementową: 6 4 8 1
Kroki
Sortowana
tablica
0
6
4
8 1
1
6
4
8 1
2
4
6
8 1
3
4
6
8 1
4
4
6
8 1
5
4
6
8 1
6
4
6
1 8
7
4
6
1 8
8
4
6
1 8
9
4
6
1 8
10
4
1
6 8
11
4
1
6 8
12
1
4
6 8
13
1
4
6 8
14
1
4
6 8
Materiał przeznaczony tylko do własnego użytku. Publikacja na innych stronach wyłącznie za zgodą autora.
[email protected]
2/9
Plik pobrano z www.lukasz-socha.pl
Ostatnia aktualizacja: 22.06.2011
Implementacja
<?php
/**
* Algorytm sortowania bąbelkowego
*
* @param int t - tablica z danymi - referencja
* @param int n - rozmiar tablicy
*
* @return void
*/
function bubbleSort(&$t, $n) {
for($i=0;$i<$n;$i++) { // glowna petla
for($j=0;$j<$n-$i-1;$j++) { // przeszukiwanie w kazdym
cyklu. Zawsze o 1 mniej.
if($t[$j]>$t[$j+1]) { // jezeli element jest wiekszy
od nastepnego nastepuje zamiana pozycjami
$temp=$t[$j];
$t[$j]=$t[$j+1];
$t[$j+1]=$temp;
}
}
}
}
?>
Złożoność obliczeniowa
Algorytm składa się z przypisywania zmiennych, instrukcji warunkowej oraz dwóch pętli.
Przypisanie do zmiennej oraz porównywanie wykonuje się w czasie stałym O(1). Pętla wewnętrzna
wykona się n razy dla i=0. W każdym kolejnym obrocie będzie o 1 mniej. Jej złożoność wynosi
O(n). Natomiast pętla zewnętrzna wykona się n razy – O(n). Sumując, złożoność czasowa wynosi
O(n*n*1) = O(n2).
Materiał przeznaczony tylko do własnego użytku. Publikacja na innych stronach wyłącznie za zgodą autora.
[email protected]
3/9
Plik pobrano z www.lukasz-socha.pl
Ostatnia aktualizacja: 22.06.2011
Optymalizacja
Algorytm sortowania bąbelkowego można z optymalizować dodając zmienną logiczną, w której
będziemy przetrzymywać informację czy w danym obrocie pętli zaszła zamiana elementów. Dzięki
temu możemy wcześniej stwierdzić czy tablica jest już całkowicie posortowana i zakończyć
działanie funkcji.
<?php
/**
* Algorytm sortowania bąbelkowego
*
* @param int t - tablica z danymi - referencja
* @param int n - rozmiar tablicy
*
* @return void
*/
function bubbleSort(&$t, $n) {
for($i=0;$i<$n;$i++) { // glowna petla
$swap=false; // nie doszlo do zamiany - pozycja poczatkowa
for($j=0;$j<$n-$i-1;$j++) { // przeszukiwanie w kazdym
cyklu. Zawsze o 1 mniej.
if($t[$j]>$t[$j+1]) { // jezeli element jest wiekszy
od nastepnego nastepuje zamiana pozycjami
$temp=$t[$j];
$t[$j]=$t[$j+1];
$t[$j+1]=$temp;
$swap=true; // zamieniono elementy
}
}
if(!$swap) { // jezeli nie doszlo do zamiany przerwij
petle
break;
}
}
Materiał przeznaczony tylko do własnego użytku. Publikacja na innych stronach wyłącznie za zgodą autora.
[email protected]
4/9
Plik pobrano z www.lukasz-socha.pl
Ostatnia aktualizacja: 22.06.2011
}
?>
Dzięki zastosowaniu tej optymalizacji ilość obrotów głównej pętli dla podanego wcześniej
przykładu zmniejszyła się z 4 do 3.
Sortowanie przez wybieranie
Sortowanie przez wybieranie (ang. Selection sort) polega na wyszukaniu elementu mającego
znaleźć się na zadanej pozycji i zamianie miejscami z tym, który jest tam obecnie. Operacja jest
wykonywana dla wszystkich indeksów sortowanej tablicy. Jest to kolejny przykład algorytmu
sortowania stabilnego.
Idea
W pierwszym kroku algorytm znajduje największy element listy i zamienia go z ostatnim
elementem. W następnym cyklu szuka drugiego elementu pod względem wielkości i zamienia z
przedostatnim itd. W i-tym kroku szukany jest największy element spośród n-i elementów listy i
zamieniany jest z elementem o n-i pozycji.
Używa się również analogicznej wariacji dla najmniejszych elementów.
Posortujemy tablicę 4-elementową: 6 4 8 1
Kroki
Sortowana
tablica
0
6
4
8 1
1
6
4
8 1
2
6
4
1 8
3
6
4
1 8
4
1
4
6 8
5
1
4
6 8
6
1
4
6 8
Materiał przeznaczony tylko do własnego użytku. Publikacja na innych stronach wyłącznie za zgodą autora.
[email protected]
5/9
Plik pobrano z www.lukasz-socha.pl
Ostatnia aktualizacja: 22.06.2011
Implementacja
<?php
/**
* Algorytm sortowania przez wybieranie
*
* @param int t - tablica z danymi - referencja
* @param int n - rozmiar tablicy
*
* @return void
*/
function selectionSort(&$t, $n) {
zaczyna
obrotem
for($i=$n-1;$i>1;$i--) { // glowna petla. Swoj "zakres"
od ostatniego elementu. Zmniejsza sie o 1 za kazdym
$max=0; // zaznaczamy t[0] jaka najwieksza wartosc
for($j=1;$j<$i;$j++) { // petla od 1 do i do szukania
najwiekszej wartosci
if($t[$j]>$t[$max]) { // jeezli dany element jest
wiekszy od max to go oznacz jako max
$max=$j;
}
}
$temp=$t[$j]; // zamiana elementow
$t[$j]=$t[$max];
$t[$max]=$temp;
}
}
?>
Materiał przeznaczony tylko do własnego użytku. Publikacja na innych stronach wyłącznie za zgodą autora.
[email protected]
6/9
Plik pobrano z www.lukasz-socha.pl
Ostatnia aktualizacja: 22.06.2011
Złożoność obliczeniowa
Algorytm składa się z przypisywania zmiennych, instrukcji warunkowej oraz dwóch pętli.
Przypisanie do zmiennej oraz porównywanie wykonuje się w czasie stałym O(1). Pętla wewnętrzna
wykona się n-1 razy dla i=n. W każdym kolejnym obrocie będzie o 1 mniej. Jej złożoność wynosi
O(n). Natomiast pętla zewnętrzna wykona się n-2 razy – O(n). Sumując, złożoność czasowa
wynosi O(n*n*1) = O(n2).
Sortowanie przez wstawianie
Algorytm sortowania przez wstawianie jest skuteczny dla małej ilości danych. Jest to jeden z
prostszych i jeden z bardziej znanych algorytmów sortowania. Jest również stabilny i nie wymaga
dodatkowej pamięci.
Idea
Przed wykonaniem i-tego kroku algorytmu posortowanych jest pierwszych i-1 elementów listy. W
i-tym kroku algorytmu wstawiamy i-ty element do posortowanej części listy. W tym celu
przeglądamy posortowaną część listy w poszukiwaniu miejsca gdzie możemy wstawić i-ty element.
Posortujemy tablicę 4-elementową: 6 4 8 1
Kroki
Sortowana
tablica
0
6
4
8 1
1
6
4
8 1
2
6
4
8 1
3
6
4
8 1
4
4
6
8 1
5
4
6
8 1
6
4
6
8 1
7
4
6
8 1
8
1
4
6 8
9
1
4
6 8
Materiał przeznaczony tylko do własnego użytku. Publikacja na innych stronach wyłącznie za zgodą autora.
[email protected]
7/9
Plik pobrano z www.lukasz-socha.pl
Ostatnia aktualizacja: 22.06.2011
Implementacja
<?php
/**
* Algorytm sortowania przez wstawianie
*
* @param int t - tablica z danymi - referencja
* @param int n - rozmiar tablicy
*
* @return void
*/
function insertSort(&$t, $n) {
for($i=1;$i<$n;$i++) { // glowna petla
if($t[$i]<$t[$i-1]) { // jezeli t[i] mniejsze od t[i-1]
$temp=$t[$i];
for($j=$i-1;($j>=0) && ($t[$j]>$pom);$j--) { // petla
szuka miejsca dla elementu temp
$t[$j+1]=$t[$j]; // przesuwanie elementow tablicy
w prawo
}
$j++;
$t[$j]=$temp; // wstawienie elementu temp w wolna luke
}
}
}
?>
Złożoność obliczeniowa
Algorytm składa się z przypisywania zmiennych, instrukcji warunkowej oraz dwóch pętli.
Przypisanie do zmiennej oraz porównywanie wykonuje się w czasie stałym O(1). Pętla wewnętrzna
wykona się n razy dla i=n. W każdym kolejnym obrocie będzie o 1 więcej. Jej złożoność wynosi
O(n). Natomiast pętla zewnętrzna wykona się n-1 razy – O(n). Sumując, złożoność czasowa
wynosi O(n*n*1) = O(n2).
Materiał przeznaczony tylko do własnego użytku. Publikacja na innych stronach wyłącznie za zgodą autora.
[email protected]
8/9
Plik pobrano z www.lukasz-socha.pl
Ostatnia aktualizacja: 22.06.2011
Podsumowanie
W artykule przedstawiłem proste algorytmy sortujące, które są łatwe w implementacji, jednak
nadają się one tylko do sortowania stosunkowo małych tablic, gdyż ich złożoność czasowa jest
rzędu O(n2). W kolejnych częściach cyklu zaprezentuję algorytmy bardziej nadające się do
sortowania dużych tablic.
Materiał przeznaczony tylko do własnego użytku. Publikacja na innych stronach wyłącznie za zgodą autora.
[email protected]
9/9

Podobne dokumenty