public abstract class Ordernacao
protected int PosicaoInicial { get; private set; }
protected int PosicaoFinal { get; private set; }
protected int Valor { get; private set; }
protected int PosicaoAuxiliarInicial { get; private set; }
protected int PosicaoAuxiliarFinal { get; private set; }
protected int ValorAuxiliar { get; private set; }
protected Ordernacao(int posicaoInicial, int posicaoFinal)
PosicaoInicial = posicaoInicial;
PosicaoFinal = posicaoFinal;
internal void Inicializar()
PosicaoAuxiliarInicial = PosicaoInicial++;
PosicaoAuxiliarFinal = PosicaoFinal;
internal bool PossuiValorParaOrdernar()
return PosicaoAuxiliarInicial <= PosicaoAuxiliarFinal;
internal void IncrementarPosicaoAuxiliarInicial(int quantidadePosicoes)
PosicaoAuxiliarInicial += quantidadePosicoes;
internal void DecrementarPosicaoAuxiliarFinal(int quantidadePosicoes)
PosicaoAuxiliarFinal -= quantidadePosicoes;
internal void IncrementarPosicaoAuxiliarFinal(int quantidadePosicoes)
PosicaoAuxiliarFinal += quantidadePosicoes;
internal bool EhValorMaiorOuIgual(int valorAtual)
return Valor >= valorAtual;
internal bool EhValorMenor(int valorAtual)
return Valor < valorAtual;
internal bool EhPosicaoInicialMenor()
return PosicaoInicial < PosicaoFinal;
public static class Helper
public static int[] ConverterFilaStringParaFilaInt(string[] fila)
int[] filaInt = new int[fila.Length];
for(int i = 0 ; i < fila.Length ; i++)
filaInt[i] = int.Parse(fila[i]);
public static string ConverterFilaIntParaString(int[] fila)
string filaString = fila[0].ToString();
foreach(int elementoFila in fila)
filaString = "," + fila.ToString();
public class QuickSort : Ordernacao
public int[] FilaInt { get; private set; }
public QuickSort(int posicaoInicial, int posicaoFinal, string[] fila) : base(posicaoInicial, posicaoFinal)
InicializarQuickSort(fila);
private void InicializarQuickSort(string[] fila)
Helper.ConverterFilaStringParaFilaInt(fila);
private void SubstituirElementoFila()
int troca = FilaInt[PosicaoAuxiliarInicial];
FilaInt[PosicaoAuxiliarInicial] = FilaInt[PosicaoAuxiliarFinal];
FilaInt[PosicaoAuxiliarFinal] = troca;
IncrementarPosicaoAuxiliarInicial(1);
DecrementarPosicaoAuxiliarFinal(1);
private void InverterPosicaoInicialFinal()
FilaInt[PosicaoInicial] = FilaInt[PosicaoFinal];
FilaInt[PosicaoAuxiliarFinal] = Valor;
private void OrdernarPosicaoInicial()
DecrementarPosicaoAuxiliarFinal(1);
private void OrdernarPosicaoFinal()
IncrementarPosicaoAuxiliarFinal(2);
if(EhPosicaoInicialMenor())
while (PossuiValorParaOrdernar())
if(EhValorMaiorOuIgual(FilaInt[ElementoFila.PosicaoAuxiliarInicial]))
IncrementarPosicaoAuxiliarInicial(1);
else if(EhValorMenor(FilaInt[ElementoFila.PosicaoAuxiliarFinal]))
DecrementarPosicaoAuxiliarFinal(1);
SubstituirElementoFila();
InverterPosicaoInicialFinal();
OrdernarPosicaoInicial();
public string RetornaOrdenacao()
if(FilaInt != null && FilaInt.Length > 0)
return Helper.ConverterFilaIntParaString(FilaInt);
public interface IOrdernarElementos
public string OrdernaArray(string[] fila);
public class OrdernarElementos : IOrdernarElementos
public string OrdernaArray(string[] fila)
int posicaoFinal = fila.Length - 1;
var ordernacao = new QuickSort(posicaoInicial,posicaoFinal,fila);
return ordernacao.RetornaOrdenacao();
public static Program instance;
private IOrdernarElementos ordenarElementos = new OrdernarElementos();
public string OrdenaArray(params string[] args)
var resultado = string.Empty;
resultado = ordenarElementos.OrdernaArray(args) ;
public string BuscaItensFaltantesNaSequencia(params string[] args)
var resultado = string.Empty;
public static void Main()
instance = instance ?? new Program();
var ordenado = instance.OrdenaArray("6", "3", "5", "4", "01", "7", "9");
var itensFaltantes = instance.BuscaItensFaltantesNaSequencia(ordenado);
var resultadoOrdenadoEsperado = "1,3,4,5,6,7,9";
var resultadoItensFaltantesEsperado = "2,8";
Console.WriteLine(ordenado == resultadoOrdenadoEsperado ? $"CORRETO {ordenado} == {resultadoOrdenadoEsperado}": $"INCORRETO {ordenado} != {resultadoOrdenadoEsperado}");
Console.WriteLine(itensFaltantes == resultadoItensFaltantesEsperado ? $"CORRETO {itensFaltantes} == {resultadoItensFaltantesEsperado}": $"INCORRETO {itensFaltantes} != {resultadoItensFaltantesEsperado}");