Saltar para o conteúdo

Counting sort: diferenças entre revisões

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
Desfeita a edição 33309509 de 177.32.67.186
Legobot (discussão | contribs)
m A migrar 18 interwikis, agora providenciados por Wikidata em d:q1124964
Linha 93: Linha 93:
</source>
</source>
[[Categoria:Algoritmos de ordenação]]
[[Categoria:Algoritmos de ordenação]]

[[cs:Counting sort]]
[[de:Countingsort]]
[[en:Counting sort]]
[[es:Ordenamiento por cuentas]]
[[fa:مرتب‌سازی شمارشی]]
[[fi:Laskentalajittelu]]
[[fr:Tri comptage]]
[[he:מיון מנייה]]
[[hy:Հաշվողական տեսակավորում]]
[[it:Counting sort]]
[[ml:കൗണ്ടിങ്ങ് സോർട്ട്]]
[[nl:Counting sort]]
[[pl:Sortowanie przez zliczanie]]
[[ru:Сортировка подсчётом]]
[[sk:Counting sort]]
[[tr:Sayarak sıralama]]
[[uk:Сортування підрахунком]]
[[zh:计数排序]]

Revisão das 05h21min de 16 de março de 2013

Counting sort
classe Algoritmo de ordenação
estrutura de dados Array, Listas ligadas
complexidade pior caso
complexidade caso médio
complexidade melhor caso
Algoritmos

Counting sort é um algoritmo de ordenação estável cuja complexidade é O(n). As chaves podem tomar valores entre 0 e M-1. Se existirem k0 chaves com valor 0, então ocupam as primeiras k0 posições do vetor final: de 0 a k0-1.

Implementações

  1. Cria cnt[M+1] e b[max N]
  2. Inicializa todas as posições de cnt a 0.
  3. Percorre o vector a e, para cada posição i de a faz cnt[a[i]-1]++ o que faz com que, no final, cada posição i de cnt contem o nº de vezes que a chave i-1 aparece em a.
  4. Acumula em cada elemento de cnt o elemento somado ao elemento anterior: cnt[i] indica a posição ordenada do primeiro elemento de chave i.
  5. Guarda em b os valores de a ordenados de acordo com b[cnt[a[i]++]=a[i]
  6. Copia b para a.
  7. Counting-Sort trabalha como uma contadora de ocorrências dentro de um programa, especificamente dentro de um vetor. Quando determinado vetor tem números repetidos, números únicos e números que não existem um outro vetor indica a quantidade de ocorrências.

Esta implementação tem a desvantagem de precisar de vectores auxiliares. O Counting Sort ordena exclusivamente números inteiros pelo fato de seus valores servirem como índices no vetor de contagem.

Código em C++

template<class T>
std::vector<T> counting_sort( const std::vector<T> &op )
{
   if( op.empty() )
      return std::vector<T>();

   T min = *std::min_element( op.begin(), op.end() );
   T max = *std::max_element( op.begin(), op.end() );

   std::vector<int> contagem( max - min + 1, 0 );

   for( std::vector<T>::const_iterator it = op.begin(); it != op.end(); ++it );
      ++contagem[ *it - min ];

   std::partial_sum( contagem.begin(), contagem.end(), contagem.begin() );

   std::vector<T> ordenado( op.size() );
   for( std::vector<T>::const_reverse_iterator it2 = op.rbegin(); it2 != op.rend(); ++it2 )
      ordenado[ --contagem[ *it2 - min ] ] = *it2;

   return ordenado;
}

Código em C

# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <ctype.h>

# define MAX 100001

struct data
{
	int number;
	char key[100];
}DataBase[MAX], VectorSort[MAX];

int CounterNum[MAX];
int size = 0;

int main (void)
{
	int i = 0;

	while(scanf("%d%s",&DataBase[size].number,DataBase[size].key) >= 1)
		size++;
	
	int aux[2] = {0,0}; 
	for(i = 0; i <= size;i++)
		aux[DataBase[i].number]++;

	aux[1] += aux[0];
	
	for(i = size - 1;i >= 0;i--)
		VectorSort[--aux[DataBase[i].number]] = DataBase[i];

	for(i = 0; i < size;i++)
		printf("Number: %d  ---  Key: %s\n",VectorSort[i].number,VectorSort[i].key);

	return 0;
}