Sortowanie kubełkowe

Stronę tą wyświetlono już: 162 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:

  • zd - dolna granica przynależności;
  • zg - górna granica przynależności

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

Listing 1
  1. d = Array();
  2. for(var i = 0; i < 100; i++){
  3. d.push(Math.random() * 100 + 20);
  4. }
  5. console.log(d);
  6. function getMinMax(table){
  7. var minmax = [table[0], table[0]];
  8. for(var i = 1; i < table.length; i++){
  9. minmax[0] = Math.min(table[i], minmax[0]);
  10. minmax[1] = Math.max(table[i], minmax[1]);
  11. }
  12. return minmax;
  13. }
  14. function createBuckets(k){
  15. var buckets = Array();
  16. for(var i = 0; i < k; i++){
  17. buckets.push(Array());
  18. }
  19. return buckets;
  20. }
  21. function compare(a, b){
  22. return a - b;
  23. }
  24. function bucketSort(data, k){
  25. var minmax = getMinMax(data);
  26. console.log("min: " + minmax[0] + " max: " + minmax[1]);
  27. var w = (minmax[1] - minmax[0]) / k;
  28. var buckets = createBuckets(k);
  29. for(var i = 0; i < data.length; i++){
  30. for(var kb = 0; kb < buckets.length; kb++){
  31. if(w * (kb + 1) + minmax[0] >= data[i]){
  32. buckets[kb].push(data[i]);
  33. break;
  34. }
  35. }
  36. }
  37. var sorted = Array();
  38. for(var i = 0; i < buckets.length; i++){
  39. buckets[i].sort(compare);
  40. console.log("Sorted " + i + " bucket " + buckets[i].join());
  41. sorted = sorted.concat(buckets[i]);
  42. }
  43. console.log("Zwracam posortowaną tablicę:");
  44. return sorted;
  45. }
  46. console.log(bucketSort(d, 10));

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

Komentarze