Drogi kolego
shazarre.
Cytat
Podejrzewam, że teraz wszyscy czytający ten temat próbują rozkminić
Ja z kolei podejrzewam, że nawet nie zadałeś sobie trudu aby zrozumieć to co napisałem. Nie winię Cię jednak za to - ale nie mierz wszystkich swoją miarą.
Cytat
co takiego TomASS wymyślił
Nie ja to wymyśliłem. Podejrzewam, że wymyślił to twórca wspaniałej książki o algorytmach - Pan Thomas (zbieżność imion?) Cormen. Algorytm "
Counting Sort" jest szeroko opisywany
np. tutaj (jeśli wolisz czytać po polsku, to
proszę bardzo).
Kod w C++ masz
tutaj. Nie widzę nigdzie zagnieżdżonych pętli. Złożoność obliczeniowa jest O(n) (dobra, niech będzie O(n+k), zmienna nie ma tutaj znaczenia). Natomiast
tutaj masz aplet Javy pokazujący jak to działa.
Cytat
ale ja Wam mogę z całą pewnością oznajmić
Widać jaką miałeś pewność - swoje "widzimisie".
Cytat
nasze (a przynajmniej większości) rozumienie sortowania mija się zdecydowanie z jego własnym
Tak - jakie to jest sortowanie rozumiane przez "większość"? Ja np. mogę zgodzić się z takim pojęciem:
"Sortowanie – jeden z podstawowych problemów informatyki. Polega na uporządkowaniu zbioru danych względem pewnych cech charakterystycznych każdego elementu tego zbioru. Szczególnym przypadkiem jest sortowanie względem wartości każdego elementu, np. sortowanie liczb, słów itp.
Algorytmy sortowania są stosowane w celu uporządkowania danych, umożliwieniu stosowania wydajniejszych algorytmów (np. wyszukiwania) i prezentacji danych w sposób czytelniejszy dla człowieka."
I to właśnie robię algorytmem Counting Sort, mało tego - żąda tego (pośrednio) autor wątku - posortowania i wybór ostatniego/pierwszego elementu. Chciałbym poznać Twoje (większości?) rozumienie słowa "sortowanie".
Wczytując się w niuanse tego algorytmu, znaleźć można zmienną o wartości największego elementu:
<?php
?>
otóż, funkcja max() (jak nospor słusznie zauważył:
"Wyliczenie max to jest jedna iteracja niezaleznie czy to jest przypadek optymalny czy nie") również działa w czasie O(n) co nie wpływa w żaden sposób na jakość algorytmu (przypominam, że O(k*n) = O(n), gdzie k jest dowolną, ale skończoną wartością).
Aby jeszcze bardziej zobrazować Ci działanie tego algorytmu, pokusiłem się o napisanie go w PHP:
<?php
function countSortTomass($arrToSort){
$length = count($arrToSort)-1;
for ($i=0;$i<=$k;$i++){
$arrTmp[$i]=0;
}
for ($i=0;$i<=$length;$i++){
$arrTmp[$arrToSort[$i]]++;
$arrSorted[]=0;
}
for ($i=1;$i<=$k;$i++){
$arrTmp[$i] = $arrTmp[$i] + $arrTmp[$i-1];
}
for ($i=$length;$i>=0;$i--){
$arrSorted[$arrTmp[$arrToSort[$i]]-1]=$arrToSort[$i];
$arrTmp[$arrToSort[$i]]--;
}
return $arrSorted;
}
$arrayToSorting = array(1
,7
,6
,10
,7
,1
,5
,7
,10
,3
); $sorted = countSortTomass($arrayToSorting);
?>
Nie ma żadnych pętli zagnieżdżonych. Złożoność obliczeniowa to O(n) (dla formalistów O(n+k)).
Kluczowym momentem jest zliczanie elementów:
<?php
for ($i=0;$i<=$length;$i++){
$arrTmp[$arrToSort[$i]]++;
}
?>
o którym pisałem wcześniej, lecz kolega
shazarre nie raczył tego zagłębić.
odpalając
<?php
$arrayToSorting = array(12
,3456
,6
,9887
,0
); $sorted = countSortTomass($arrayToSorting);
?>
Także uzyskamy prawidłowy wynik (jak chciał autor postu) w czasie porównywalnym (przy nieskończonej ilości danych w takim samym czasie) co max() czyli O(n)