Kova Sıralama Algoritması (Java, Python, C/C++ Kod Örnekleri)

Kova Sıralaması Nedir?

Genellikle bin sort olarak adlandırılan kova sıralaması, sıralanmamış bir diziyi girdi olarak kabul eden ve sonuç olarak sıralanmış bir dizi üreten bir karşılaştırmalı sıralama yöntemidir. Bu yöntem, öğeleri birkaç bölüme dağıtarak ve bu bölümlerin her birini ekleme sıralaması gibi herhangi bir sıralama algoritmasıyla ayrı ayrı sıralayarak çalışır. Daha sonra tüm kovalar sıralanmış bir dizi oluşturacak şekilde birleştirilir.

Kova sıralaması genellikle öğeler aşağıdaki durumlarda kullanılır:

  1. Kayan nokta değerleri
  2. Belirli bir aralıkta eşit olarak dağıtılmış

Kova sıralamasının zaman karmaşıklığı kullanılan kova sayısına ve giriş dağılımının tekdüzeliğine bağlıdır. Farklı sıralama algoritmaları gibi kabuk sıralaması, birleştirme sıralaması, yığın sıralaması ve hızlı sıralama En iyi durum zaman karmaşıklığı olan O(n*logn) elde edilebilirken, kova sıralama algoritması aynı zamanda doğrusal zaman karmaşıklığı olan O(n)'de de elde edilebilir.

Kova sıralaması, dağıtma-toplama yaklaşımını takip eder. Bu yaklaşımı uygulayarak, elemanlar karşılık gelen kovalara dağıtılır, kovalarda sıralanır ve son adım olarak sıralanmış bir dizi oluşturmak üzere toplanır. Bu dağıtma-toplama yaklaşımı aşağıdaki bölümde ele alınmaktadır

Dağıt-Topla-Yaklaşımı

Büyük ölçekli, karmaşık problemler bazen çözülmesi zor olabilir. Dağılım-toplama yaklaşımı, tüm veri setini kümelere bölerek bu tür problemleri çözmeye çalışır. Daha sonra her küme ayrı ayrı ele alınır ve nihai cevaba ulaşmak için her şey tekrar bir araya getirilir.

Kova sıralama algoritması dağılım-toplama yöntemini şu şekilde uygular:

Dağıt-Topla-Yaklaşımı

Kova Sıralaması Nasıl Çalışır?

Kova sıralamasının temel çalışma prensibi şu şekildedir:

  1. Bir dizi boş kova oluşturulur. Farklı politikalara bağlı olarak paket sayısı farklılık gösterebilir.
  2. Giriş dizisinden her öğeyi karşılık gelen klasöre yerleştirin.
  3. Bu kovaları tek tek sıralayın.
  4. Tek bir çıktı dizisi oluşturmak için sıralanan paketleri birleştirin.

Ayrıntılı çalışma adımları aşağıdaki bölümlerde yer almaktadır.

Sözde Kod

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

Yöntem 1: Kayan Nokta için Kova Sıralama Algoritması Numbers

0.0 ile 1.0 aralığındaki kayan nokta sayıları için kova sıralama algoritması:

) 1 Adım İlk bölümün [10, 0.0] aralığında sayılar içerecek şekilde on(0.1) boş bölüm oluşturun. Daha sonra ikinci kova [0.1, 0.2) dahilinde olacaktır ve bu böyle devam edecektir.

) 2 Adım Her dizi öğesi için:

      A. Aşağıdaki formülü kullanarak kova endeksini hesaplayın:
      paket dizini= no_of_buckets *array_element
      B. Öğeyi pakete[bucket_index] ekleyin

) 3 Adım Ekleme sıralamasını kullanarak her bir grubu ayrı ayrı sıralayın.

) 4 Adım Tüm paketleri tek bir dizide birleştirin.

Bir kova sıralama örneğine bakalım. Bu örnek için, kova sıralama algoritmasını kullanarak aşağıdaki diziyi sıralayacağız:

Kayan Nokta için Kova Sıralama Algoritması Numbers

) 1 Adım Öncelikle 10 adet boş kova oluşturacağız. İlk grup [0.0, 0.1) arasındaki sayıları içerecektir. Daha sonra ikinci kova [0.1, 0.2) arasındaki sayıları içerecektir.

Kayan Nokta için Kova Sıralama Algoritması Numbers

) 2 Adım Her dizi elemanı için kova indeksini hesaplayacağız ve elemanı o kovaya yerleştireceğiz.

Kova endeksi aşağıdaki formül kullanılarak hesaplanabilir:
              Bucket_index= no_of_buckets*array_element

Kova Endeksi Hesaplaması:
a) 0.78
      Bucket_index = no_of_buckets*array_element
                   = 10 * 0.78
                   = 7.8
Dolayısıyla 0.78 elemanı kova[zemin(7.8)] veya kova[7] üzerinde depolanacaktır.

Kayan Nokta için Kova Sıralama Algoritması Numbers

b) 0.17
      Bucket_index = no_of_buckets * dizi öğesi
                   = 10 * 0.17
                   = 1.7

0.17 dizi öğesi kova[kat(1.7)] veya kova[1]'de depolanacaktır.

Kayan Nokta için Kova Sıralama Algoritması Numbers

c) 0.39
      Bucket_index = no_of_buckets * dizi öğesi
                   = 10 * 0.39
                   = 3.9
   0.39 kova[zemin(3.9)] veya kova[3] üzerinde depolanacaktır.

Kayan Nokta için Kova Sıralama Algoritması Numbers

Tüm dizi öğeleri üzerinde yineleme yaptıktan sonra, kovalar aşağıdaki gibi olacaktır:

Kayan Nokta için Kova Sıralama Algoritması Numbers

) 3 Adım Daha sonra her bir paket, ekleme sıralaması kullanılarak sıralanacaktır. Sıralama işleminden sonra çıktı şu şekilde olacaktır:

Kayan Nokta için Kova Sıralama Algoritması Numbers

) 4 Adım Son adımda kovalar tek bir dizide birleştirilecektir. Bu dizi girdinin sıralanmış sonucu olacaktır.

Her paket çıkış dizisine birleştirilecektir. Örneğin ikinci kova elemanlarının birleştirilmesi:

Kayan Nokta için Kova Sıralama Algoritması Numbers

Son kova elemanlarının birleşimi şu şekilde olacaktır:

Kayan Nokta için Kova Sıralama Algoritması Numbers

Birleştirmeden sonra ortaya çıkan dizi, istenen sıralanmış dizi olacaktır.

Kayan Nokta için Kova Sıralama Algoritması Numbers

C/'de Kova Sıralama ProgramıC++

Giriş:

//Bucket Sort Program in C/C++
//For not having 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: \n";
 for (int i = 0; i< array_size; i++)
 cout<<input[i]<<" ";
return 0;
}

Çıktı:

Sorted Output:
0.12 0.17 0.21 0.23 0.26 0.39 0.69 0.72 0.78 0.94

Kova Sıralama Programı Python

Giriş:

# Bucket Sort Program in Python
# For not having 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))

Çıktı:

Sorted Output:
[0.12, 0.17, 0.21, 0.23, 0.26, 0.39, 0.69, 0.72, 0.78, 0.94]

Kova Sıralaması Java

Giriş:

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]+" ");
        }
    }
}

Çıktı:

Sorted Output:
0.12 0.17 0.21 0.23 0.26 0.39 0.69 0.72 0.78 0.94

Yöntem 2: Tamsayı Elemanları için Kova Sıralama Algoritması

[0.0, 1.0] aralığının ötesinde sayılar içeren giriş için paket sıralama algoritması öncekinden biraz farklıdır algoritma. Bu durum için gerekli adımlar aşağıdaki gibidir:

) 1 Adım Maksimum ve minimum elemanları bulun.

) 2 Adım Demet sayısını (n) seçin ve bu demetleri boş olarak başlatın.

) 3 Adım Aşağıdaki formülü kullanarak her bir paketin aralığını veya aralığını hesaplayın:
               span = (maximum - minimum)/n

) 4 Adım Her dizi öğesi için:

    1. Kova endeksini hesaplayın:
                   bucket_index = (element - minimum)/span
    2. Elemanı kovaya[bucket_index] yerleştirin

) 5 Adım Ekleme sıralamasını kullanarak her bir grubu sıralayın.

) 6 Adım Tüm kovaları tek bir dizide birleştirin.

Bu kova sıralama algoritmasının bir örneğine bakalım. Bu örnek için, kova sıralama algoritmasını kullanarak aşağıdaki diziyi sıralayacağız-

Tam Sayılı Elemanlar için Kova Sıralama Algoritması

) 1 Adım İlk adımda verilen dizinin maksimum ve minimum elemanlarının bulunması gerekmektedir. Bu örnekte maksimum 24 ve minimum 1'dir.

) 2 Adım Şimdi bir dizi boş kova seçmeliyiz, n. Bu örnekte 5 kova alacağız. Daha sonra bunları boş olarak başlatacağız.

) 3 Adım Her bir kovanın genişliği aşağıdaki formülle hesaplanmalıdır:
               span = (maximum-minimum)/n = (24-1)/5 = 4;

Dolayısıyla ilk kova [0, 5) aralığındaki sayıları içerecektir. İkinci grup [5, 10) vb. içindeki sayıları içerecektir.

Tam Sayılı Elemanlar için Kova Sıralama Algoritması

) 4 Adım Her dizi elemanı için kova indeksini hesaplayacağız ve elemanı o kovaya yerleştireceğiz. Kova endeksi aşağıdaki formül kullanılarak hesaplanabilir:
               bucket_index = (element - minimum)/span

Kova Endeksi Hesaplaması:

    a) 11bucket_index = (öğe – minimum)/aralık
                       =(11-1)/4
                       =2

Böylece 11 numaralı eleman kova[2]'de depolanacaktır.

Tam Sayılı Elemanlar için Kova Sıralama Algoritması

    b) 9
    Bucket_index = (öğe – minimum)/aralık
                       =(9-1)/4
                       =2

Not: 9, kova[1] için bir sınır elemanı olduğundan, önceki elemanın aynı kovasına eklemek yerine kovaya[1] eklenmesi gerekir.

Tam Sayılı Elemanlar için Kova Sıralama Algoritması

Her bir eleman için işlemler yapıldıktan sonra kovalar aşağıdaki gibi olacaktır:

Tam Sayılı Elemanlar için Kova Sıralama Algoritması

) 5 Adım Artık her paket ekleme sıralaması kullanılarak sıralanacak. Ayırdıktan sonra kovalar...

Tam Sayılı Elemanlar için Kova Sıralama Algoritması

) 6 Adım Son adımda kovalar tek bir dizide birleştirilecektir. O dizi girdinin sıralanmış sonucu olacaktır.

Tam Sayılı Elemanlar için Kova Sıralama Algoritması

C/'de Kova Sıralama ProgramıC++

Giriş:

#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; i < input.size(); i++)
    cout <<input[i]<<" ";
  return 0;
}

Çıktı:

Sorted Output:1 8 9 11 12 13 17 19 21 24

Kova Sıralama Programı Python

Giriş:

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:\n", input)

Çıktı:

Sorted Output:
[1, 8, 9, 11, 12, 13, 17, 19, 21, 24]

Kova Sıralaması Java

Giriş:

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 + " ");
        }
    }
}

Çıktı:

Sorted Output:
1.0 8.0 9.0 11.0 12.0 13.0 17.0 19.0 21.0 24.0

Artılar ve eksiler

Artılar Eksiler
Daha hızlı hesaplama gerçekleştirin Diğer algoritmalara göre daha fazla yer tüketir
Harici bir sıralama yöntemi olarak kullanılabilir Veriler eşit şekilde dağıtılmadığında kötü performans gösterir
Kovalar bağımsız olarak işlenebilir

Kova Sıralama Karmaşıklık Analizi

Kova Sıralamasının Zaman Karmaşıklığı

  • En İyi Durum Karmaşıklığı:Dizinin tüm elemanları önceden eşit şekilde dağıtılmış ve sıralanmışsa, elemanları karşılık gelen bölmelere dağıtmak O(n) süresine ihtiyaç duyacaktır. Daha sonra her bir kovayı kullanarak sıralama ekleme türü maliyeti O(k) olurdu. Dolayısıyla genel karmaşıklık O(n+k) olurdu.
  • Ortalama Vaka Karmaşıklığı:Ortalama durumlar için girdilerin düzgün dağıtıldığını varsayıyoruz. Bu nedenle kova sıralama algoritması O(n+k) doğrusal zaman karmaşıklığına ulaşır. Burada elemanları dağıtmak için O(n) zaman ve bu elemanları ekleme sıralaması kullanarak sıralamak için O(k) zaman gerekir.
  • En Kötü Durum Karmaşıklığı:En kötü durumda, öğeler bir veya iki belirli kova üzerinde eşit şekilde dağıtılmayacak ve yoğunlaşmayacaktır. Bu durumda, kova sıralaması şu şekilde çalışacaktır: kabarcık sıralama algoritması. Bu nedenle, en kötü durumda, bir kova sıralamasının zaman karmaşıklığı O(n^2) olacaktır.

Kova Sıralamasının Uzay Karmaşıklığı

Kova sıralamasının uzay karmaşıklığı O(n*k)'dır. Burada n eleman sayısı ve k gerekli kova sayısıdır.