Сортировка сегментами: простой и эффективный алгоритм сортировки на языке C

В мире алгоритмов и методов сортировки есть один метод, который выделяется своей простотой и эффективностью: сегментная сортировка. Этот алгоритм сортировки особенно хорошо работает при работе с набором равномерно распределенных элементов. В этой статье мы углубимся в детали сегментной сортировки, объясним, как она работает, приведем примеры кода на C и исследуем ее временную и пространственную сложность.

Что такое сегментная сортировка?
Групповая сортировка — это алгоритм сортировки на основе распределения, который делит входные данные на конечное число сегментов. Каждый сегмент представляет собой диапазон значений и изначально пуст. Затем элементы входного массива распределяются по сегментам в зависимости от их значений. После этого каждая корзина сортируется индивидуально, либо с использованием другого алгоритма сортировки, либо с применением рекурсивной сортировки. Наконец, отсортированные элементы из всех сегментов объединяются для получения отсортированного вывода.

Пример кода на C:
Давайте посмотрим на простую реализацию сегментарной сортировки на C:

#include <stdio.h>
// Function to sort the array using Bucket Sort
void bucketSort(int array[], int n) {
    // Choose the number of buckets (here, we assume 10)
    const int numBuckets = 10;

    // Create the buckets
    int buckets[numBuckets][n];
    int bucketSize[numBuckets] = {0};

    // Distribute the elements into buckets
    for (int i = 0; i < n; i++) {
        int bucketIndex = array[i] / numBuckets;
        buckets[bucketIndex][bucketSize[bucketIndex]++] = array[i];
    }
// Sort the elements within each bucket
    for (int i = 0; i < numBuckets; i++) {
        // Applying another sorting algorithm (e.g., Insertion Sort)
        for (int j = 1; j < bucketSize[i]; j++) {
            int key = buckets[i][j];
            int k = j - 1;

            while (k >= 0 && buckets[i][k] > key) {
                buckets[i][k + 1] = buckets[i][k];
                k--;
            }

            buckets[i][k + 1] = key;
        }
    }
// Concatenate the sorted elements from all buckets
    int index = 0;
    for (int i = 0; i < numBuckets; i++) {
        for (int j = 0; j < bucketSize[i]; j++) {
            array[index++] = buckets[i][j];
        }
    }
}
// Example usage
int main() {
    int array[] = {29, 25, 10, 12, 22, 18, 30, 45, 37};
    int n = sizeof(array) / sizeof(array[0]);

    printf("Original array: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }

    bucketSort(array, n);

    printf("\nSorted array: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }

    return 0;
}

В этом примере у нас есть массив целых чисел, который мы хотим отсортировать с помощью сегментной сортировки. Код сначала делит элементы на сегменты на основе их значений. Затем он применяет простой алгоритм сортировки (в данном случае сортировку вставками) для сортировки элементов в каждом сегменте. Наконец, отсортированные элементы из всех сегментов объединяются для получения окончательного отсортированного массива.

Временная и пространственная сложность.
Временная сложность сегментной сортировки зависит от алгоритма сортировки, используемого в каждом сегменте. В приведенном выше примере мы использовали сортировку вставками, средняя временная сложность которой составляет O(n^2). Однако если элементы внутри каждого сегмента распределены равномерно, средняя временная сложность сегментной сортировки составляет примерно O(n). Пространственная сложность сортировки сегментов равна O(n + k), где n — количество элементов, а k — количество сегментов.

Сортировка по сегментам – это простой и эффективный алгоритм сортировки, который хорошо работает, когда входные элементы распределены равномерно. Разделяя элементы на сегменты и сортируя их по отдельности, Bucket Sort обеспечивает в среднем линейную временную сложность. В этой статье мы предоставили пример кода на языке C и объяснили основные концепции сортировки по сегментам. Теперь вы можете с уверенностью использовать этот алгоритм для эффективной сортировки данных.