बकेट सॉर्ट एल्गोरिथ्म (Java, Python, सी/C++ Code उदाहरण)
⚡ स्मार्ट सारांश
बकेट सॉर्ट इनपुट तत्वों को कई बकेट में बिखेरता है, प्रत्येक बकेट को स्वतंत्र रूप से सॉर्ट करता है, और अंत में एक सॉर्टेड ऐरे बनाने के लिए उन्हें एकत्रित करता है।

बकेट सॉर्ट क्या है?
बकेट सॉर्ट, जिसे बिन सॉर्ट भी कहा जाता है, एक तुलना-आधारित वितरण सॉर्टिंग विधि है जो इनपुट के रूप में एक अव्यवस्थित ऐरे लेती है और आउटपुट के रूप में एक सॉर्टेड ऐरे देती है। यह तकनीक तत्वों को कई बकेट में विभाजित करती है और प्रत्येक बकेट को इंसर्शन सॉर्ट जैसे किसी अन्य सॉर्टिंग एल्गोरिदम का उपयोग करके अलग-अलग सॉर्ट करती है। फिर, सभी बकेट को मिलाकर अंतिम सॉर्टेड ऐरे बनाया जाता है।
बकेट सॉर्ट का उपयोग आमतौर पर तब किया जाता है जब तत्व निम्न प्रकार के हों:
- फ़्लोटिंग-पॉइंट मान
- एक ज्ञात सीमा पर समान रूप से वितरित
बकेट सॉर्ट की समय जटिलता उपयोग किए गए बकेट की संख्या और इनपुट वितरण की एकरूपता पर निर्भर करती है। जबकि अन्य सॉर्टिंग एल्गोरिदम जैसे कि शैल सॉर्ट, मर्ज सॉर्ट, हीपसॉर्ट, और जल्दी से सुलझाएं सर्वोत्तम स्थिति में O(n*logn) की समय जटिलता प्राप्त करने के साथ-साथ, बकेट सॉर्ट एल्गोरिदम अनुकूल परिस्थितियों में रैखिक समय जटिलता O(n) तक भी पहुंच सकता है।
बकेट सॉर्ट स्कैटर-गैदर विधि का अनुसरण करता है। तत्वों को उनके संबंधित बकेट में बिखेरा जाता है, प्रत्येक बकेट के अंदर क्रमबद्ध किया जाता है, और अंतिम चरण में एक क्रमबद्ध ऐरे बनाने के लिए एकत्रित किया जाता है। इस स्कैटर-गैदर विधि पर अगले भाग में चर्चा की गई है।
स्कैटर-गैदर दृष्टिकोण
बड़े पैमाने पर और जटिल समस्याओं को सीधे हल करना कभी-कभी चुनौतीपूर्ण हो सकता है। स्कैटर-गैदर दृष्टिकोण संपूर्ण डेटासेट को क्लस्टर में विभाजित करके ऐसी समस्याओं का समाधान करता है। प्रत्येक क्लस्टर को अलग-अलग संसाधित किया जाता है, और अंतिम उत्तर प्राप्त करने के लिए परिणामों को एक साथ लाया जाता है।
बकेट सॉर्ट एल्गोरिदम स्कैटर-गैदर विधि को इस प्रकार लागू करता है:
बकेट सॉर्ट कैसे काम करता है
बकेट सॉर्ट का मूल कार्य सिद्धांत इस प्रकार है:
- खाली बाल्टियों का एक सेट बनाया जाता है। चुनी गई नीति के आधार पर, बाल्टियों की संख्या भिन्न हो सकती है।
- इनपुट ऐरे से, प्रत्येक तत्व को उसके संबंधित बकेट में रखा जाता है।
- प्रत्येक बाल्टी को द्वितीयक छँटाई एल्गोरिदम का उपयोग करके व्यक्तिगत रूप से क्रमबद्ध किया जाता है।
- क्रमबद्ध बकेटों को संयोजित करके एक एकल आउटपुट ऐरे तैयार किया जाता है।
उपनाम Code
Start Create N empty buckets For each array element: Calculate bucket index Put that element into the corresponding bucket For each bucket: Sort elements within each bucket Merge all the elements from each bucket Output the sorted array End
विधि 1: फ्लोटिंग-पॉइंट के लिए बकेट सॉर्ट एल्गोरिदम Numbers
[0.0, 1.0] सीमा के भीतर फ्लोटिंग-पॉइंट संख्याओं के लिए बकेट सॉर्ट एल्गोरिथम:
चरण 1) दस (10) खाली बाल्टियाँ बनाएँ। पहली बाल्टी में [0.0, 0.1) सीमा के भीतर संख्याएँ रखें। दूसरी बाल्टी में [0.1, 0.2) रखें, और इसी प्रकार आगे भी।
चरण 2) प्रत्येक सरणी तत्व के लिए:
- a. बकेट इंडेक्स की गणना निम्न सूत्र का उपयोग करके करें:
बकेट_इंडेक्स = बकेट की संख्या * ऐरे_एलिमेंट - b. तत्व को बकेट[बकेट_इंडेक्स] में डालें
चरण 3) सम्मिलन सॉर्ट का उपयोग करके प्रत्येक बकेट को अलग-अलग सॉर्ट करें।
चरण 4) सभी बकेट को एक ही क्रमबद्ध ऐरे में संयोजित करें।
आइए बकेट सॉर्ट का एक उदाहरण समझते हैं। इस उदाहरण के लिए, हम निम्नलिखित ऐरे को सॉर्ट करेंगे:
चरण 1) सबसे पहले, हम 10 खाली बाल्टियाँ बनाते हैं। पहली बाल्टी में [0.0, 0.1) के बीच की संख्याएँ होती हैं। दूसरी बाल्टी में [0.1, 0.2) होती हैं, और इसी तरह आगे भी।
चरण 2) ऐरे के प्रत्येक तत्व के लिए, बकेट इंडेक्स की गणना करें और तत्व को उस बकेट में रखें।
बकेट इंडेक्स की गणना निम्न सूत्र का उपयोग करके की जाती है:
बकेट_इंडेक्स = बकेट की संख्या * ऐरे_एलिमेंट
बकेट इंडेक्स गणना:
एक) 0.78
बकेट_इंडेक्स = बकेट की संख्या * ऐरे_एलिमेंट
= 10 * 0.78
= 7.8
अतः, तत्व 0.78 बकेट[फ्लोर(7.8)] या बकेट[7] में संग्रहीत है।
बी) 0.17
बकेट_इंडेक्स = बकेट की संख्या * ऐरे_एलिमेंट
= 10 * 0.17
= 1.7
सरणी तत्व 0.17 बकेट[फ्लोर(1.7)] या बकेट[1] में संग्रहीत है।
ग) 0.39
बकेट_इंडेक्स = बकेट की संख्या * ऐरे_एलिमेंट
= 10 * 0.39
= 3.9
0.39 बकेट[फ्लोर(3.9)] या बकेट[3] में संग्रहीत है।
सभी ऐरे तत्वों पर इटरेट करने के बाद, बकेट इस प्रकार दिखते हैं:
चरण 3) इसके बाद प्रत्येक बकेट को इंसर्शन सॉर्ट विधि का उपयोग करके क्रमबद्ध किया जाता है। सॉर्टिंग प्रक्रिया के बाद आउटपुट इस प्रकार है:
चरण 4) अंतिम चरण में, सभी बकेट को एक ही ऐरे में संयोजित किया जाता है। यह ऐरे इनपुट का क्रमबद्ध परिणाम होता है।
प्रत्येक बकेट को आउटपुट ऐरे में जोड़ा जाता है। उदाहरण के लिए, दूसरे बकेट के तत्वों का संयोजन:
अंतिम बकेट तत्वों का संयोजन नीचे दिखाया गया है:
संयोजन के बाद, परिणामी ऐरे वांछित क्रमबद्ध ऐरे होता है।
सी/ में बकेट सॉर्ट प्रोग्रामC++
इनपुट:
//Bucket Sort Program in C/C++ //For values without integer parts #include <bits/stdc++.h> #define BUCKET_SIZE 10 using namespace std; void bucketSort(float input[], int array_size) { vector <float>bucket[BUCKET_SIZE]; for (int i = 0; i < array_size; i++) { int index = BUCKET_SIZE*input[i]; bucket[index].push_back(input[i]); } for (int i = 0; i < BUCKET_SIZE; i++) sort(bucket[i].begin(), bucket[i].end()); int out_index = 0; for (int i = 0; i < BUCKET_SIZE; i++) for (int j = 0; j < bucket[i].size(); j++) input[out_index++] = bucket[i][j]; } int main() { float input[]={0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.69}; int array_size = sizeof(input)/sizeof(input[0]); bucketSort(input, array_size); cout <<"Sorted Output: "; for (int i = 0; i< array_size; i++) cout<<input[i]<<" "; return 0; }
आउटपुट:
Sorted Output: 0.12 0.17 0.21 0.23 0.26 0.39 0.69 0.72 0.78 0.94
बकेट सॉर्ट कार्यक्रम Python
इनपुट:
# Bucket Sort Program in Python # For values without integer parts def bucketSort(input): output = [] bucket_size = 10 for bucket in range(bucket_size): output.append([]) for element in input: index = int(bucket_size * element) output[index].append(element) for bucket in range(bucket_size): output[bucket] = sorted(output[bucket]) out_index = 0 for bucket in range(bucket_size): for element in range(len(output[bucket])): input[out_index] = output[bucket][element] out_index += 1 return input input = [0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.69] print("Sorted Output:") print(bucketSort(input))
आउटपुट:
Sorted Output: [0.12, 0.17, 0.21, 0.23, 0.26, 0.39, 0.69, 0.72, 0.78, 0.94]
बकेट सॉर्ट इन Java
इनपुट:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class BucketSort { private static final int BUCKET_SIZE = 10; public static void bucketSort(float[] input, int arraySize) { List<Float>[] bucket = new ArrayList[BUCKET_SIZE]; for (int i = 0; i < arraySize; i++) { int index = (int)(BUCKET_SIZE * input[i]); if (bucket[index] == null) { bucket[index] = new ArrayList<>(); } bucket[index].add(input[i]); } for (int i = 0; i < BUCKET_SIZE; i++) { if (bucket[i] != null) { Collections.sort(bucket[i]); } } int outIndex = 0; for (int i = 0; i < BUCKET_SIZE; i++) { if (bucket[i] != null) { for (float value: bucket[i]) { input[outIndex++] = value; } } } } public static void main(String[] args) { float[] input = {0.78f,0.17f,0.39f,0.26f,0.72f,0.94f,0.21f,0.12f,0.23f,0.69f}; int arraySize = input.length; bucketSort(input, arraySize); System.out.println("Sorted Output:"); for (int i = 0; i < arraySize; i++) { System.out.print(input[i]+" "); } } }
आउटपुट:
Sorted Output: 0.12 0.17 0.21 0.23 0.26 0.39 0.69 0.72 0.78 0.94
विधि 2: पूर्णांक तत्वों के लिए बकेट सॉर्ट एल्गोरिथ्म
इनपुट में [0.0, 1.0] सीमा से बाहर की संख्याओं के लिए बकेट सॉर्ट एल्गोरिथम पिछले एल्गोरिथम से थोड़ा अलग है। कलन विधिइस मामले के लिए आवश्यक चरण निम्नलिखित हैं:
चरण 1) एरे में अधिकतम और न्यूनतम तत्वों का पता लगाएं।
चरण 2) बाल्टियों की संख्या, n, का चयन करें और उन्हें प्रारंभ में खाली रखें।
चरण 3) सूत्र का उपयोग करके प्रत्येक बकेट की सीमा या अवधि की गणना करें:
span = (maximum - minimum) / n
चरण 4) प्रत्येक सरणी तत्व के लिए:
- 1. बकेट इंडेक्स की गणना करें:
bucket_index = (element - minimum) / span - 2. तत्व को बकेट[बकेट_इंडेक्स] में डालें
चरण 5) प्रत्येक बकेट को सम्मिलन सॉर्ट का उपयोग करके सॉर्ट करें।
चरण 6) सभी बकेटों को एक एकल सारणी में संयोजित करें।
आइए इस बकेट सॉर्ट एल्गोरिदम के एक उदाहरण को समझते हैं। इस उदाहरण के लिए, हम निम्नलिखित ऐरे को सॉर्ट करेंगे:
चरण 1) पहले चरण में, हम दिए गए ऐरे के अधिकतम और न्यूनतम तत्वों का पता लगाते हैं। इस उदाहरण के लिए, अधिकतम मान 24 है और न्यूनतम मान 1 है।
चरण 2) इसके बाद, हम खाली बाल्टियों की संख्या, n का चयन करते हैं। इस उदाहरण में, हम 5 बाल्टियों का उपयोग करते हैं और उन्हें शुरू में खाली रखते हैं।
चरण 3) प्रत्येक बाल्टी की अवधि की गणना निम्न सूत्र का उपयोग करके की जाती है:
span = (maximum - minimum) / n = (24 - 1) / 5 = 4
अतः, पहले बकेट में [0, 5) के बीच की संख्याएँ हैं। दूसरे बकेट में [5, 10) हैं, और इसी प्रकार आगे भी।
चरण 4) प्रत्येक ऐरे एलिमेंट के लिए, बकेट इंडेक्स की गणना करें और एलिमेंट को उस बकेट में रखें। बकेट इंडेक्स की गणना निम्न सूत्र का उपयोग करके की जाती है:
bucket_index = (element - minimum) / span
बकेट इंडेक्स गणना:
एक) 11
बकेट_इंडेक्स = (तत्व – न्यूनतम) / स्पैन
= (11 – 1) / 4
= 2
इस प्रकार, तत्व 11 को बकेट[2] में संग्रहीत किया जाता है।
बी) 9
बकेट_इंडेक्स = (तत्व – न्यूनतम) / स्पैन
= (9 – 1) / 4
= 2
नोट: चूंकि 9 बकेट[1] के लिए एक सीमा तत्व है, इसलिए इसे पिछले तत्व के समान बकेट में रखने के बजाय बकेट[1] में जोड़ा जाता है।
प्रत्येक तत्व के लिए संक्रियाएं करने के बाद, बाल्टियाँ इस प्रकार दिखाई देती हैं:
चरण 5) अब, प्रत्येक बकेट को इंसर्शन सॉर्ट का उपयोग करके सॉर्ट किया जाता है। सॉर्ट करने के बाद बकेट इस प्रकार होंगे:
चरण 6) अंतिम चरण में, बकेटों को एक ही ऐरे में संयोजित किया जाता है। सरणी यह इनपुट का क्रमबद्ध परिणाम है।
सी/ में बकेट सॉर्ट प्रोग्रामC++
इनपुट:
#include<bits/stdc++.h> using namespace std; void bucketSort(vector < double > & input, int No_Of_Buckets) { double max_value = * max_element(input.begin(), input.end()); double min_value = * min_element(input.begin(), input.end()); double span = (max_value - min_value) / No_Of_Buckets; vector<vector <double>> output; for (int i = 0; i < No_Of_Buckets; i++) output.push_back(vector <double>()); for (int i = 0; i < input.size(); i++) { double difference = (input[i] - min_value) / span - int((input[i] - min_value) / span); if (difference == 0 && input[i] != min_value) output[int((input[i] - min_value) / span) - 1].push_back(input[i]); else output[int((input[i] - min_value) / span)].push_back(input[i]); } for (int i = 0; i < output.size(); i++) { if (!output[i].empty()) sort(output[i].begin(), output[i].end()); } int index = 0; for (vector <double> & bucket: output) { if (!bucket.empty()) { for (double i: bucket) { input[index] = i; index++; } } } } int main() { vector <double> input ={11,9,21,8,17,19,13,1,24,12}; int No_Of_Buckets = 5; bucketSort(input, No_Of_Buckets); cout<<"Sorted Output:"; for (int i=0; i < input.size(); i++) cout <<input[i]<<" "; return 0; }
आउटपुट:
Sorted Output:1 8 9 11 12 13 17 19 21 24
बकेट सॉर्ट कार्यक्रम Python
इनपुट:
def bucketSort(input, No_Of_Buckets): max_element = max(input) min_element = min(input) span = (max_element - min_element) / No_Of_Buckets output = [] for bucket in range(No_Of_Buckets): output.append([]) for element in range(len(input)): diff = (input[element] - min_element) / span - int( (input[element] - min_element) / span ) if diff == 0 and input[element] != min_element: output[int((input[element] - min_element) / span) - 1].append( input[element] ) else: output[int((input[element] - min_element) / span)].append(input[element]) for bucket in range(len(output)): if len(output[bucket]) != 0: output[bucket].sort() index = 0 for bucket in output: if bucket: for element in bucket: input[index] = element index = index + 1 input = [11, 9, 21, 8, 17, 19, 13, 1, 24, 12] No_Of_Buckets = 5 bucketSort(input, No_Of_Buckets) print("Sorted Output: ", input)
आउटपुट:
Sorted Output: [1, 8, 9, 11, 12, 13, 17, 19, 21, 24]
बकेट सॉर्ट इन Java
इनपुट:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class BucketSort { public static void bucketSort(List < Double > input, int No_Of_Buckets) { double max_value = Collections.max(input); double min_value = Collections.min(input); double span =(max_value - min_value) / No_Of_Buckets; List<List<Double>> output = new ArrayList<>(); for (int i = 0; i < No_Of_Buckets; i++) { output.add(new ArrayList<>()); } for (Double value: input) { double difference = (value - min_value) / span - ((value - min_value) / span); if (difference == 0 && value != min_value) { output.get((int)((value - min_value) / span) - 1).add(value); } else { output.get((int)((value - min_value) / span)).add(value); } } for (List <Double> bucket: output) { if (!bucket.isEmpty()) { Collections.sort(bucket); } } int index = 0; for (List <Double> bucket: output) { if (!bucket.isEmpty()) { for (Double value: bucket) { input.set(index,value); index++; } } } } public static void main(String[] args) { List <Double> input = new ArrayList<>(); input.add(11.0); input.add(9.0); input.add(21.0); input.add(8.0); input.add(17.0); input.add(19.0); input.add(13.0); input.add(1.0); input.add(24.0); input.add(12.0); int No_Of_Buckets = 5; bucketSort(input, No_Of_Buckets); System.out.println("Sorted Output:"); for (Double value: input) { System.out.print(value + " "); } } }
आउटपुट:
Sorted Output: 1.0 8.0 9.0 11.0 12.0 13.0 17.0 19.0 21.0 24.0
बकेट सॉर्ट के फायदे और नुकसान
| फ़ायदे | नुकसान |
|---|---|
| समान रूप से वितरित डेटा पर तेज़ गणना करता है | इन-प्लेस सॉर्टिंग एल्गोरिदम की तुलना में अधिक स्थान की खपत करता है। |
| इसका उपयोग बड़े डेटासेट के लिए बाह्य सॉर्टिंग विधि के रूप में किया जा सकता है। | जब डेटा समान रूप से वितरित नहीं होता है तो खराब प्रदर्शन होता है |
| बकेट को स्वतंत्र रूप से और समानांतर रूप से संसाधित किया जा सकता है। | डेटा रेंज और वितरण की जानकारी पहले से ही आवश्यक है। |
बकेट सॉर्ट जटिलता विश्लेषण
बकेट सॉर्ट समय जटिलता
- सर्वोत्तम स्थिति जटिलता: यदि सभी ऐरे तत्व प्रत्येक बकेट में समान रूप से वितरित और पूर्व-क्रमबद्ध हैं, तो तत्वों को संबंधित बकेट में बिखेरने में O(n) समय लगता है। फिर प्रत्येक बकेट को क्रमबद्ध करने में लगने वाला समय... सम्मिलन सॉर्ट लागत O(k) है। इस प्रकार कुल जटिलता O(n+k) है।
- औसत मामला जटिलता: सामान्य मामलों के लिए, हम मानते हैं कि इनपुट समान रूप से वितरित हैं। इस प्रकार बकेट सॉर्ट एल्गोरिदम O(n+k) की रैखिक समय जटिलता प्राप्त करता है। यहाँ, तत्वों को बिखेरने के लिए O(n) समय और सम्मिलन सॉर्ट का उपयोग करके उन्हें क्रमबद्ध करने के लिए O(k) समय की आवश्यकता होती है।
- सबसे खराब स्थिति जटिलता: सबसे खराब स्थिति में, तत्व समान रूप से वितरित नहीं होते हैं और एक या दो बकेट में केंद्रित हो जाते हैं। उस स्थिति में, बकेट सॉर्ट का व्यवहार एक समान हो जाता है। बबल सॉर्ट एल्गोरिदमअतः, सबसे खराब स्थिति में, बकेट सॉर्ट की समय जटिलता O(n²) है।
बकेट सॉर्ट की स्थान जटिलता
बकेट सॉर्ट की स्पेस कॉम्प्लेक्सिटी O(n*k) है। यहाँ, n तत्वों की संख्या है और k सॉर्टिंग के दौरान उन्हें रखने के लिए आवश्यक बकेट की संख्या है।


















