Estructura de datos y algoritmo: algoritmo de ordenación gráfica de radix e implementación de código C / C ++ [Colección recomendada]

1. Introducción a Cardinal Sort

Radix Sort (Radix Sort) es una extensión de la clasificación de cubos. Su idea básica es cortar enteros en diferentes números por dígitos y luego compararlos de acuerdo con cada dígito.
El método específico es: unificar todos los valores que se van a comparar con la misma longitud de dígitos, y rellenar ceros delante de los números con dígitos más cortos. Luego, comenzando desde el bit más bajo, ordene una vez en secuencia. Entonces, después de ordenar desde el orden más bajo hasta el más alto, la secuencia se convierte en una secuencia ordenada.

2. Descripción gráfica de la clasificación cardinal

Ordene la matriz {53, 3, 542, 748, 14, 214, 154, 63, 616} por orden de base. Su diagrama esquemático es el siguiente:
Inserte la descripción de la imagen aquí
En la figura anterior, primero unifique todas las resinas para compararlas con una longitud de dígito uniforme y, a continuación, a partir del bit más bajo, ordene en orden.

  1. Ordene de acuerdo con un solo dígito.
  2. Ordenar por decenas.
  3. Ordene por cien dígitos.
    Después de ordenar, la secuencia se convierte en una secuencia ordenada.

Código de clasificación base

/*
 * 获取数组a中最大值
 *
 * 参数说明:
 *     a -- 数组
 *     n -- 数组长度
 */
int get_max(int a[], int n)
{
    
    
    int i, max;

    max = a[0];
    for (i = 1; i < n; i++)
        if (a[i] > max)
            max = a[i];
    return max;
}

/*
 * 对数组按照"某个位数"进行排序(桶排序)
 *
 * 参数说明:
 *     a -- 数组
 *     n -- 数组长度
 *     exp -- 指数。对数组a按照该指数进行排序。
 *
 * 例如,对于数组a={50, 3, 542, 745, 2014, 154, 63, 616};
 *    (01) 当exp=1表示按照"个位"对数组a进行排序
 *    (02) 当exp=10表示按照"十位"对数组a进行排序
 *    (03) 当exp=100表示按照"百位"对数组a进行排序
 *    ...
 */
void count_sort(int a[], int n, int exp)
{
    
    
    int output[n];             // 存储"被排序数据"的临时数组
    int i, buckets[10] = {
    
    0};

    // 将数据出现的次数存储在buckets[]中
    for (i = 0; i < n; i++)
        buckets[ (a[i]/exp)%10 ]++;

    // 更改buckets[i]。目的是让更改后的buckets[i]的值,是该数据在output[]中的位置。
    for (i = 1; i < 10; i++)
        buckets[i] += buckets[i - 1];

    // 将数据存储到临时数组output[]中
    for (i = n - 1; i >= 0; i--)
    {
    
    
        output[buckets[ (a[i]/exp)%10 ] - 1] = a[i];
        buckets[ (a[i]/exp)%10 ]--;
    }

    // 将排序好的数据赋值给a[]
    for (i = 0; i < n; i++)
        a[i] = output[i];
}

/*
 * 基数排序
 *
 * 参数说明:
 *     a -- 数组
 *     n -- 数组长度
 */
void radix_sort(int a[], int n)
{
    
    
    int exp;    // 指数。当对数组按各位进行排序时,exp=1;按十位进行排序时,exp=10;...
    int max = get_max(a, n);    // 数组a中的最大值

    // 从个位开始,对数组a按"指数"进行排序
    for (exp = 1; max/exp > 0; exp *= 10)
        count_sort(a, n, exp);
}

La función de radix_sort (a, n) es ordenar la matriz a.

  1. Primero, obtenga el valor máximo en la matriz a hasta get_max (a). El propósito de obtener el valor máximo es calcular el índice máximo de la matriz a.

  2. Después de obtener el mayor exponente de la matriz a, comenzando por el exponente 1, clasifique los elementos de la matriz a de acuerdo con el número de bits. La clasificación por cubos se utiliza al clasificar.

  3. La función de count_sort (a, n, exp) es ordenar la matriz a de acuerdo con el exponente exp.
    A continuación se presenta brevemente el proceso de clasificación de la matriz {53, 3, 542, 748, 14, 214, 154, 63, 616} por dígitos individuales.
    (01) El rango de valores del lugar de las unidades es [0,10). Por lo tanto, consulte la matriz de cubos cubos [] y agregue la matriz al cubo según el valor del dígito de la unidad.
    Inserte la descripción de la imagen aquí
    (02) A continuación, ordene de acuerdo con la matriz de cubos cubos []. Suponga que la matriz ordenada se almacena en la salida []; los datos se pueden ordenar encontrando la conexión entre la salida [] y los depósitos [].
    Inserte la descripción de la imagen aquí
    El editor recomienda mi propio grupo de intercambio de tecnología de lenguaje linuxC / C ++: [ 1106675687 ] He recopilado algunos libros de aprendizaje y materiales de video que creo que es mejor compartir en los archivos del grupo, ¡y puede agregarlos si los necesita!
    Inserte la descripción de la imagen aquí

En tercer lugar, la implementación del ordenamiento por radix


Código de implementación de implementación Radix sort C (radix_sort.c)

 View Code


Código de implementación de implementación Radix Sort C ++ (RadixSort.cpp)

 View Code


Código de implementación de implementación de Java de Radix Sort (RadixSort.java)

 View Code

Los principios y los resultados de las tres implementaciones anteriores son los mismos. Aquí está su salida:

before sort:53 3 542 748 14 214 154 63 616 
after  sort:3 14 53 63 154 214 542 616 748 

Supongo que te gusta

Origin blog.csdn.net/m0_50662680/article/details/113056302
Recomendado
Clasificación