Contar Ordenar lograr detallada

Lo que cuenta es el tipo

Un algoritmo de ordenación para ordenar el recuento no se basa en la comparación. Su ventaja es que cuando los números enteros de clasificación dentro de un cierto rango, su complejidad es Ο (n + k) (donde k es un número entero en el intervalo), más rápido que cualquier comparación algoritmo de ordenación. Por supuesto, este es un espacio sacrificio por el enfoque de tiempo.

presentación de mapa móvil

* Móvil figura de tutorial principiante

implementación

Por ejemplo, es conocido por ser matriz ordenada de rangos de números, utilizar la velocidad más rápida de tipo.
Si el rango de 1-9, como se muestra en la figura en movimiento por encima de
un, encontrar el máximo y el mínimo array
dos, para establecer una max-min+1matriz de espacio, cada elemento del valor inicial 0
En tercer lugar, para atravesar el ordenados al azar array
ejemplo, el primer número es 2, entonces el elemento de matriz subíndice 2 más 1
segundo número es 3, el subíndice del elemento de matriz 3 plus 1
así
cuatro, al final, se obtiene una matriz, la matriz cada valor representa el número de valores de índice aparece en la matriz ordenada.
En quinto lugar, llegar directamente a través de la matriz, el valor del índice de salida, el valor del número de elementos, que se emite varias veces.

Ordenar finalización

En el caso de que el rango no es muy grande, el rendimiento especie contar incluso más rápido que la ( norte   l la sol norte ) O (n \ log n) de pedido

parámetros de rendimiento en relación con el recuento de la clasificación

1, tiempo de complejidad

la ( norte ) O (n)

2, la complejidad del espacio

la ( norte ) O (n)

3, es estable

estable

la implementación del código

/*
 * @Descripttion: 
 * @version: 
 * @Author: edisonhuang
 * @Date: 2020-03-12 16:17:54
 * @LastEditors: edisonhuang
 * @LastEditTime: 2020-03-12 16:32:34
 */
#include <iostream>
void Print(int arr[], int length);
void CountSort(int arr[],int length);
using namespace std;

int main()
{   
    int arr[] = {13, 14, 8, 100, 25, 75, 9, 64, 12};
    int len = (int) sizeof(arr) / sizeof(*arr);
    Print(arr, len);
    CountSort(arr, len);
    Print(arr, len);
    
    return 0;
}

void CountSort(int arr[],int length){
    // 找最大值和最小值
    int max,min;
    max = arr[0];
    min = arr[0];
    for (int i = 0; i < length; i++)
    {
        if(arr[i] > max)
        {
            max = arr[i];
        }
        if(arr[i] < min)
        {
            min = arr[i];
        }
        
    }
    //根据最大最小值开辟数组
    int *count;
    count = (int *)malloc(sizeof(int ) * (max-min+1));
    memset(count,0,sizeof(int ) * (max-min+1));

    // 统计原数组各值个数
    for (int i = 0; i < length; i++)
    {
        count[arr[i]-min]++;
    }
    // 放回原数组
    int j = 0;
    for (int  i = 0; i < max-min+1; i++)
    {
        while (count[i] !=0 )
        {
            arr[j] = i+min;
            j++;
            count[i]--;
        }
        
    }
    
    
}

void Print(int arr[], int length)
{
    for (int i = 0; i < length; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}
Publicado 35 artículos originales · ganado elogios 1 · vistas 1841

Supongo que te gusta

Origin blog.csdn.net/qq_40672635/article/details/104822023
Recomendado
Clasificación