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+1
matriz 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 de pedido
parámetros de rendimiento en relación con el recuento de la clasificación
1, tiempo de complejidad
2, la complejidad del espacio
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;
}