logo

Algoritmus třídění bucket

V tomto článku budeme diskutovat o algoritmu třídění bucket. Datové položky v třídění segmentů jsou distribuovány ve formě segmentů. Při kódování nebo technických pohovorech pro softwarové inženýry jsou často kladeny dotazy na třídicí algoritmy. Je tedy důležité o tématu diskutovat.

Bucket sort je třídicí algoritmus, který rozděluje prvky do několika skupin, které se nazývají segmenty. Prvky v segmentovém třídění jsou nejprve jednotně rozděleny do skupin nazývaných segmenty a poté jsou seřazeny podle jakéhokoli jiného třídícího algoritmu. Poté jsou prvky shromážděny tříděným způsobem.

Základní postup provádění třídění lopaty je dán následovně -

  • Nejprve rozdělte rozsah do pevného počtu segmentů.
  • Poté hoďte každý prvek do příslušného kbelíku.
  • Poté seřaďte každý segment jednotlivě pomocí třídícího algoritmu.
  • A nakonec spojte všechny roztříděné kbelíky.

Výhody kbelíkového třídění jsou -

  • Bucket sort snižuje ne. srovnání.
  • Je asymptoticky rychlý díky rovnoměrnému rozložení prvků.

Omezení třídění segmentů jsou -

  • Může nebo nemusí jít o stabilní třídicí algoritmus.
  • Není užitečné, pokud máme velké pole, protože to zvyšuje náklady.
  • Nejedná se o místní třídicí algoritmus, protože k setřídění segmentů je potřeba určitý prostor navíc.

Nejlepší a průměrná složitost třídění segmentů je O(n + k) , a nejhorší případ složitosti třídění segmentů je Na2) , kde n je počet položek.

Běžně se používá bucket sort -

  • S plovoucí desetinnou čárkou.
  • Když je vstup distribuován rovnoměrně v rozsahu.

Základní myšlenka k provedení třídění lopatek je dána následovně -

 bucketSort(a[], n) 1. Create 'n' empty buckets 2. Do for each array element a[i] 2.1. Put array elements into buckets, i.e. insert a[i] into bucket[n*a[i]] 3. Sort the elements of individual buckets by using the insertion sort. 4. At last, gather or concatenate the sorted buckets. End bucketSort 

Nyní se podívejme na algoritmus třídění segmentů.

Algoritmus

 Bucket Sort(A[]) 1. Let B[0....n-1] be a new array 2. n=length[A] 3. for i=0 to n-1 4. make B[i] an empty list 5. for i=1 to n 6. do insert A[i] into list B[n a[i]] 7. for i=0 to n-1 8. do sort list B[i] with insertion-sort 9. Concatenate lists B[0], B[1],........, B[n-1] together in order End 

Rozptylový přístup

Algoritmus třídění Bucket můžeme porozumět pomocí metody scatter-gather. Zde se dané prvky nejprve rozsypou do kbelíků. Po rozptýlení jsou prvky v každém kbelíku seřazeny pomocí stabilního třídícího algoritmu. Nakonec budou setříděné prvky shromážděny v pořadí.

Vezměme si netříděné pole, abychom porozuměli procesu třídění segmentů. Uspořádání lopaty bude snazší pochopit na příkladu.

Nechť prvky pole jsou -

kbelíkový druh

Nyní vytvořte segmenty s rozsahem od 0 do 25. Rozsah segmentů je 0-5, 5-10, 10-15, 15-20, 20-25. Prvky se vkládají do lopatek podle rozsahu lopatek. Předpokládejme, že hodnota položky je 16, takže bude vložena do segmentu s rozsahem 15-20. Podobně se podle toho vloží každá položka pole.

Tato fáze je známá jako rozptyl prvků pole .

kbelíkový druh

Nyní, seřadit každý kbelík samostatně. Prvky každého segmentu lze třídit pomocí libovolného ze stabilních třídicích algoritmů.

kbelíkový druh

Nakonec, shromáždit seřazené prvky z každého kbelíku v pořadí

kbelíkový druh

Nyní je pole kompletně seřazeno.

Složitost řazení lopatek

Nyní se podívejme na časovou složitost třídění segmentů v nejlepším případě, průměrném případě a v nejhorším případě. Uvidíme také prostorovou složitost bucket sort.

1. Časová složitost

Pouzdro Čas Složitost
Nejlepší případ O(n + k)
Průměrný případ O(n + k)
Nejhorší případ Na2)
    Nejlepší složitost případu –Nastane, když není vyžadováno žádné třídění, tj. pole je již seřazeno. Při třídění podle segmentů nejlepší případ nastane, když jsou prvky rovnoměrně rozmístěny v segmentech. Složitost bude lepší, pokud jsou prvky již roztříděny v kbelících.
    Pokud k řazení prvků segmentu použijeme řazení vložení, bude celková složitost lineární, tj. O(n + k), kde O(n) je pro vytváření segmentů a O(k) je pro řazení prvků segmentu. v nejlepším případě pomocí algoritmů s lineární časovou složitostí.
    Nejlepší časová složitost třídění segmentů je O(n + k) .Průměrná složitost případu –Vyskytuje se, když jsou prvky pole v neuspořádaném pořadí, které není správně vzestupné a není správně sestupné. Třídění segmentů probíhá v lineárním čase, i když jsou prvky rovnoměrně rozmístěny. Průměrná časová složitost třídění segmentů je O(n + K) .Složitost nejhoršího případu -Při třídění podle segmentů nastává nejhorší případ, když jsou prvky v poli v blízkém dosahu, kvůli tomu musí být umístěny ve stejném segmentu. Takže některé kbelíky mají více prvků než jiné.
    Složitost se zhorší, když budou prvky v opačném pořadí.
    Nejhorší případ časové složitosti třídění bucket je Na2) .

2. Prostorová složitost

Vesmírná složitost O(n*k)
Stabilní ANO
  • Prostorová složitost segmentového třídění je O(n*k).

Implementace bucket sort

Nyní se podívejme na programy třídění segmentů v různých programovacích jazycích.

Program: Napište program pro implementaci třídění segmentů v jazyce C.

 #include int getMax(int a[], int n) // function to get maximum element from the given array { int max = a[0]; for (int i = 1; i max) max = a[i]; return max; } void bucket(int a[], int n) // function to implement bucket sort { int max = getMax(a, n); //max is the maximum element of array int bucket[max], i; for (int i = 0; i <= max; i++) { bucket[i]="0;" } for (int i="0;" < n; bucket[a[i]]++; j="0;" 0) a[j++]="i;" bucket[i]--; void printarr(int a[], int n) function to print array elements ++i) printf('%d ', a[i]); main() a[]="{54," 12, 84, 57, 69, 41, 9, 5}; n="sizeof(a)" sizeof(a[0]); is the size of printf('before sorting are - 
'); printarr(a, n); bucket(a, printf('
after pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/04/bucket-sort-algorithm-5.webp" alt="bucket sort"> <p> <strong>Program:</strong> Write a program to implement bucket sort in C++.</p> <pre> #include using namespace std; int getMax(int a[], int n) // function to get maximum element from the given array { int max = a[0]; for (int i = 1; i max) max = a[i]; return max; } void bucket(int a[], int n) // function to implement bucket sort { int max = getMax(a, n); //max is the maximum element of array int bucket[max], i; for (int i = 0; i <= max; i++) { bucket[i]="0;" } for (int i="0;" < n; bucket[a[i]]++; j="0;" 0) a[j++]="i;" bucket[i]--; void printarr(int a[], int n) function to print array elements ++i) cout< <a[i]<<' '; main() a[]="{34," 42, 74, 57, 99, 84, 9, 5}; n="sizeof(a)" sizeof(a[0]); is the size of cout<<'before sorting are - 
'; printarr(a, n); bucket(a, cout<<'
after pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/04/bucket-sort-algorithm-6.webp" alt="bucket sort"> <p> <strong>Program:</strong> Write a program to implement bucket sort in C#.</p> <pre> using System; class Bucket { static int getMax(int[] a) // function to get maximum element from the given array { int n = a.Length; int max = a[0]; for (int i = 1; i max) max = a[i]; return max; } static void bucket(int[] a) // function to implement bucket sort { int n = a.Length; int max = getMax(a); //max is the maximum element of array int[] bucket = new int[max+1]; for (int i = 0; i <= 10 max; i++) { bucket[i]="0;" } for (int i="0;" < n; bucket[a[i]]++; j="0;" 0) a[j++]="i;" bucket[i]--; static void printarr(int[] a) * function to print the array int i; n="a.Length;" (i="0;" console.write(a[i] + ' '); main() int[] a="{" 95, 50, 45, 15, 20, }; console.write('before sorting elements are - 
'); printarr(a); bucket(a); console.write('
after pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/04/bucket-sort-algorithm-7.webp" alt="bucket sort"> <p> <strong>Program:</strong> Write a program to implement bucket sort in Java.</p> <pre> public class Bucket { int getMax(int a[]) // function to get maximum element from the given array { int n = a.length; int max = a[0]; for (int i = 1; i max) max = a[i]; return max; } void bucket(int a[]) // function to implement bucket sort { int n = a.length; int max = getMax(a); //max is the maximum element of array int bucket[] = new int[max+1]; for (int i = 0; i <= 9 max; i++) { bucket[i]="0;" } for (int i="0;" < n; bucket[a[i]]++; j="0;" 0) a[j++]="i;" bucket[i]--; void printarr(int a[]) * function to print the array int i; n="a.length;" (i="0;" system.out.print(a[i] + ' '); public static main(string[] args) a[]="{" 90, 40, 5, 15, 30, }; bucket b1="new" bucket(); system.out.print('before sorting elements are - 
'); b1.printarr(a); b1.bucket(a); system.out.print('
after pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/04/bucket-sort-algorithm-8.webp" alt="bucket sort"> <p>So, that&apos;s all about the article. Hope the article will be helpful and informative to you.</p> <p>This article was not only limited to the algorithm. Along with the algorithm, we have also discussed the bucket sort complexity, working, and implementation in different programming languages.</p> <hr></=></pre></=></pre></=></pre></=>