Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 6625 razy

Sortowanie kubełkowe polega na podzieleniu danych d na mniejsze częściowo posegregowane według określonych kryteriów partie danych, które w późniejszym czasie są sortowane indywidualnie. Pewnym szczególnym wariantem tego typu sortowania jest wcześniej już omawiany algorytm sortowania przez zliczanie. Dla danych liczbowych można algorytm sortowania kubełkowego przedstawić w sposób bardziej elastyczny wymagający znajomości maksimum i minimum wartości występujących w tablicy danych d. Wtedy to bowiem można określić kryteria przynależności danego elementu do pojemnika np. dla podziału zakresu danych zbioru d na k części zakres danych dla i-tego pojemnika będzie określony następującymi granicami:

zakres dolny dla podziału danych przy sortowaniu kubełkowym [1]

Zapis wyrażenia w formacie TeX-a:

z_d = \frac{max - min}{k}\cdot i + min
zakres dolny dla podziału danych przy sortowaniu kubełkowym [2]

Zapis wyrażenia w formacie TeX-a:

z_g = \frac{max - min}{k}\cdot (i + 1) + min

gdzie:

Przykład kodu wykorzystującego powyższą zasadę do sortowania wylosowanych liczb zmiennoprzecinkowych:

d = Array(); for(var i = 0; i < 100; i++){ d.push(Math.random() * 100 + 20); } console.log(d); function getMinMax(table){ var minmax = [table[0], table[0]]; for(var i = 1; i < table.length; i++){ minmax[0] = Math.min(table[i], minmax[0]); minmax[1] = Math.max(table[i], minmax[1]); } return minmax; } function createBuckets(k){ var buckets = Array(); for(var i = 0; i < k; i++){ buckets.push(Array()); } return buckets; } function compare(a, b){ return a - b; } function bucketSort(data, k){ var minmax = getMinMax(data); console.log("min: " + minmax[0] + " max: " + minmax[1]); var w = (minmax[1] - minmax[0]) / k; var buckets = createBuckets(k); for(var i = 0; i < data.length; i++){ for(var kb = 0; kb < buckets.length; kb++){ if(w * (kb + 1) + minmax[0] >= data[i]){ buckets[kb].push(data[i]); break; } } } var sorted = Array(); for(var i = 0; i < buckets.length; i++){ buckets[i].sort(compare); console.log("Sorted " + i + " bucket " + buckets[i].join()); sorted = sorted.concat(buckets[i]); } console.log("Zwracam posortowaną tablicę:"); return sorted; } console.log(bucketSort(d, 10));

Złożoność obliczeniowa w najgorszym przypadku dla tego algorytmu wynosi n2 w najlepszym n.