Рубрики

Ковш сортировать

Сортировка по группам в основном полезна, когда входные данные равномерно распределены по диапазону. Например, рассмотрим следующую проблему.
Отсортируйте большой набор чисел с плавающей запятой, которые находятся в диапазоне от 0,0 до 1,0 и равномерно распределены по всему диапазону. Как мы эффективно сортируем числа?

Простой способ — применить алгоритм сортировки, основанный на сравнении. Нижняя граница для алгоритма сортировки на основе сравнения (сортировка слиянием, сортировка по кучи, быстрая сортировка и т. Д.) Составляет Ω (n Log n), т. Е. Они не могут работать лучше, чем nLogn.
Можем ли мы отсортировать массив по линейному времени? Отсчет сортировки не может быть применен здесь, так как мы используем ключи как индекс при подсчете сортировки. Здесь ключи являются числами с плавающей запятой.
Идея состоит в том, чтобы использовать сортировку ведром. Ниже приводится алгоритм ковша.

bucketSort(arr[], n)
1) Create n empty buckets (Or lists).
2) Do following for every array element arr[i].
.......a) Insert arr[i] into bucket[n*array[i]]
3) Sort individual buckets using insertion sort.
4) Concatenate all sorted buckets.

Сложность времени: если мы предположим, что вставка в сегмент занимает время O (1), то шаги 1 и 2 приведенного выше алгоритма явно занимают время O (n). O (1) легко возможно, если мы используем связанный список для представления сегмента (в следующем коде вектор C ++ используется для простоты). Шаг 4 также занимает O (n) времени, поскольку во всех сегментах будет n элементов.
Основным этапом анализа является этап 3. Этот этап также занимает в среднем время O (n), если все числа распределены равномерно (см. Книгу CLRS для получения более подробной информации).

Ниже приведена реализация вышеуказанного алгоритма.

C / C ++

// C ++ программа для сортировки массива с использованием сортировки по сегментам
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

  
// Функция для сортировки arr [] размера n с использованием сортировки по сегментам

void bucketSort(float arr[], int n)

{

    // 1) Создать n пустых сегментов

    vector<float> b[n];

     

    // 2) Поместить элементы массива в разные сегменты

    for (int i=0; i<n; i++)

    {

       int bi = n*arr[i]; // Индекс в корзине

       b[bi].push_back(arr[i]);

    }

  

    // 3) Сортировка отдельных ведер

    for (int i=0; i<n; i++)

       sort(b[i].begin(), b[i].end());

  

    // 4) Объединить все сегменты в arr []

    int index = 0;

    for (int i = 0; i < n; i++)

        for (int j = 0; j < b[i].size(); j++)

          arr[index++] = b[i][j];

}

  
/ * Программа драйвера для проверки вышеуказанной функции * /

int main()

{

    float arr[] = {0.897, 0.565, 0.656, 0.1234, 0.665, 0.3434};

    int n = sizeof(arr)/sizeof(arr[0]);

    bucketSort(arr, n);

  

    cout << "Sorted array is \n";

    for (int i=0; i<n; i++)

       cout << arr[i] << " ";

    return 0;

}

python3

# Python3 программа для сортировки массива
# использование сортировки ведра

def insertionSort(b):

    for i in range(1, len(b)):

        up = b[i]

        j = i - 1

        while j >=0 and b[j] > up: 

            b[j + 1] = b[j]

            j -= 1

        b[j + 1] = up     

    return b     

              

def bucketSort(x):

    arr = []

    slot_num = 10 № 10 означает 10 слотов, каждый

                  # размер слота 0.1

    for i in range(slot_num):

        arr.append([])

          

    # Поместить элементы массива в разные сегменты

    for j in x:

        index_b = int(slot_num * j) 

        arr[index_b].append(j)

      

    # Сортировка отдельных ведер

    for i in range(slot_num):

        arr[i] = insertionSort(arr[i])

          

    # объединить результат

    k = 0

    for i in range(slot_num):

        for j in range(len(arr[i])):

            x[k] = arr[i][j]

            k += 1

    return x

  
Код водителя

x = [0.897, 0.565, 0.656,

     0.1234, 0.665, 0.3434

print("Sorted Array is")

print(bucketSort(x))

  
# Этот код предоставлен
# Oneil Hsiao

Выход:

Sorted array is
0.1234 0.3434 0.565 0.656 0.665 0.897

Сортировка ведра для сортировки массива с отрицательными числами

Ссылки:
Введение в алгоритмы 3-е издание Клиффорд Стейн, Томас Х. Кормен, Чарльз Э. Лейзерсон, Рональд Л. Ривест
http://en.wikipedia.org/wiki/Bucket_sort


Фотосъёмка:







Викторина по сортировке ковшей

Другие алгоритмы сортировки на GeeksforGeeks / GeeksQuiz:

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Ковш сортировать

0.00 (0%) 0 votes