¿Cómo funciona el ciclo de clasificación?

Ah! Uno de mis favoritos. Gracias por A2A.

Me aseguraré de no aburrirte hasta la muerte con mucha teoría. Trataré de mantenerlo simple y corto 🙂

Los fundamentos básicos de la ordenación cíclica se encuentran en la posición de cada elemento en la versión ordenada de la matriz de entrada. Al hacerlo, mueve el elemento a esa posición calculada y comienza de nuevo para el elemento que sacó para dejar espacio para el elemento cuya posición en la matriz ordenada se encontró.
A medida que continúe haciendo esto, observará que esto realmente forma un ciclo, es decir, alcanza exactamente la misma posición desde donde comenzó. Una vez que encuentra un ciclo, comienza desde el siguiente índice.
Teoría suficiente. Aquí está el código.

#include
#include
#include
usando el espacio de nombres estándar;

clase CycleSort
{
público:
CycleSort (tamaño int sin signo);
~ CycleSort ();
nulo Initialize ();
int Sort ();
Imprimir vacío ();

privado:
intercambio nulo (int & a, int & b)
{
int temp = a;
a = b;
b = temp;
}

int * dataArr;
tamaño int;
};

CycleSort :: CycleSort (tamaño int sin signo): tamaño (tamaño)
{
if (tamaño! = 0)
{
dataArr = new int [size] ();
}
más
{
dataArr = NULL;
}
}

CycleSort :: ~ CycleSort ()
{
if (dataArr) borra dataArr;
}

vacío CycleSort :: Initialize ()
{
/ * Sembrar el generador de números aleatorios con la hora actual para que
* los números serán diferentes cada vez que corramos.
* /
srand ((sin signo) tiempo (NULL));

para (int i = 0; i <tamaño; ++ i)
{
dataArr [i] = rand ()% 100 + 10;
}
}

int CycleSort :: Sort ()
{
int escribe = 0;

// Recorre la matriz para encontrar ciclos para rotar.
for (int cycleStart = 0; cycleStart <tamaño – 1; ++ cycleStart)
{
int item = dataArr [cycleStart];

// Encuentra dónde poner el artículo.
int pos = cycleStart;
para (int i = cycleStart + 1; i <tamaño; ++ i)
if (dataArr [i] <elemento)
pos + = 1;

// Si el artículo ya está allí, esto no es un ciclo.
if (pos == cycleStart)
Hacer continuación;

// De lo contrario, coloque el elemento allí o justo después de cualquier duplicado.
while (item == dataArr [pos])
pos + = 1;

swap (dataArr [pos], elemento);
escribe + = 1;

// Rotar el resto del ciclo.
while (pos! = cycleStart)
{
// Encuentra dónde poner el artículo.
pos = cycleStart;
para (int i = cycleStart + 1; i <tamaño; ++ i)
if (dataArr [i] <elemento)
pos + = 1;

// Coloque el elemento allí o justo después de cualquier duplicado.
while (item == dataArr [pos])
pos + = 1;

swap (dataArr [pos], elemento);
escribe + = 1;
}
}

retorno escribe;
}

vacío CycleSort :: Print ()
{
para (int i = 0; i <tamaño; ++ i)
cout << dataArr [i] << "";

cout << endl;
}

int main () {

CycleSort cycleSort (7);
cycleSort.Initialize ();
cycleSort.Print ();
cycleSort.Sort ();
cycleSort.Print ();

devuelve 0;
}

Ideone.com

Referencia (s):
Tipo de ciclo

También te puede interesar mi otro artículo aquí:
Un algoritmo en el lugar para la transformación de cadenas – GeeksforGeeks