Estrutura de Dados – Ordenação de Vetor (Insertion Sort) em C

Caros usuários venho expor através deste código a implementação do método
de ordenação de vetores [Insertion Sort] de forma Estática e Dinâmica.

[C]
#include
#include

int vetor[5];
//int vetor[5] = {5, 4, 3, 2, 1};

typedef struct ELista
{
int inf;
struct ELista * prox;
struct ELista * ant;
} TLista;

TLista * lista, *novo, *ultimo, *atual, *anterior;

void primeiro(int informacao)
{
lista = malloc(sizeof (TLista));
lista->inf = informacao;
}

void demais(int informacao)
{
novo = malloc(sizeof (TLista));
novo->inf = informacao;
ultimo = lista;

while (ultimo->prox != NULL)
{
ultimo = ultimo->prox;
}

ultimo->prox = novo;
novo->ant = ultimo;
}

void add(int informacao)
{
if (lista == NULL)
primeiro(informacao);
else
demais(informacao);
}

//Listar Dinâmico
void listarD()
{
ultimo = lista;
while (ultimo != NULL)
{
printf(“%d\n”, ultimo->inf);
ultimo = ultimo->prox;
}
}

//Listar Estático
void listar()
{
int i;
for (i = 0; i < 5; i++) { printf("%d\n", vetor[i]); } } void insertionSort() { int i,chave,j; for (i = 1; i < 5;i++) { chave = vetor[i]; j = i - 1; while (vetor[j] > chave && j >= 0)
{
vetor[j + 1] = vetor[j];
j–;
}

vetor[j + 1] = chave;
}
}

void insertionSortD()
{

int chave;

atual = lista->prox;

while (atual != NULL)
{
chave = atual->inf;
anterior = atual->ant;

while(anterior != NULL && anterior->inf > chave)
{
anterior->prox->inf = anterior->inf;
anterior = anterior->ant;
}

if (anterior == NULL)
lista->inf = chave;
else
anterior->prox->inf = chave;

atual = atual->prox;
}
}

int main(int argc, char** argv)
{
add(5);
add(4);
add(3);
add(2);
add(1);

//Dinamico
insertionSortD();
listarD();

//Estático
/*
insertionSort();
listar();
*/

return (EXIT_SUCCESS);
}

[/C]

Desenvolvido por Prof. Emmanuel Silva Xavier.

Soma dos ‘n’ primeiros números (2 Soluções)

Dado um número inteiro positivo n, calcular a soma dos primeiros números naturais. 
[C]/*
* SOLUCAO 1
*/

#include <stdio.h>

int main() {
int n, /* guarda o numero dado */
i, /* contador */
soma; /* guarda as somas parcias */

printf(“ntCalculo da soma dos n primeiros numeros naturaisn”);

/* Inicializacoes */
printf(“nDigite o valor de n: “);
scanf(“%d”, &n);
soma = 0;
i = 1;

/* Calculo da soma */
while (i <= n) {
soma = soma + i;
i = i + 1;
}

/* Escreve a resposta */
printf(“A soma dos %d primeiros numeros naturais e’ %dn”, n, soma);

return 0;
}

/*
* SOLUCAO 2
*/

#include <stdio.h>

int main() {
int n, /* guarda o numero dado */
soma; /* guarda as somas parcias */

printf(“ntCalculo da soma dos n primeiros numeros naturaisn”);

/* Inicializacoes */
printf(“nDigite o valor de n: “);
scanf(“%d”, &n);

/* Calcula a soma */
soma = (n * (n + 1)) / 2;

/* Escreve a resposta */
printf(“A soma dos %d primeiros numeros naturais e’ %dn”, n, soma);

return 0;
}
[/C]

Três números (ordem crescente) (5 Soluções)

[C]/*
* SOLUCAO 1. Simples, curta e grossa.
*
*/
#include <stdio.h>

int main()
{
int n1, n2, n3; /* dados de entrada */

printf(“Digite tres numeros: “);
scanf(“%d %d %d”, &n1, &n2, &n3);

/* Existem 6 possiveis ordens para imprimior os numeros lidos */
if (n1 <= n2 && n2 <= n3)
{
printf(“A ordem crescente: %d %d %dn”, n1, n2, n3);
}
else if (n1 <= n3 && n3 <= n2)
{
printf(“A ordem crescente: %d %d %dn”, n1, n3, n2);
}
else if (n2 <= n1 && n1 <= n3)
{
printf(“A ordem crescente: %d %d %dn”, n2, n1, n3);
}
else if (n2 <= n3 && n3 <= n1)
{
printf(“A ordem crescente: %d %d %dn”, n2, n3, n1);
}
else if (n3 <= n1 && n1 <= n2)
{
printf(“A ordem crescente: %d %d %dn”, n3, n1, n2);
}
else /* n3 <= n2 && n2 < n1 */
{
printf(“A ordem crescente: %d %d %dn”, n3, n2, n1);
}

return 0;
}

/*
* SOLUCAO 2.
*
*/

#include <stdio.h>

int main() {
int n1, n2, n3; /* dados de entrada */

printf(“Digite tres numeros: “);
scanf(“%d”, &n1);
scanf(“%d”, &n2);
scanf(“%d”, &n3);

if (n3 > n1)
if (n1 > n2)
printf(“A ordem crescente: %d %d %dn”, n2, n1, n3);
else if (n2 < n3)
printf(“A ordem crescente: %d %d %dn”, n1, n2, n3);
if (n1 > n2)
if (n2 > n3)
printf(“A ordem crescente: %d %d %dn”, n3, n2, n1);
else if (n3 < n1)
printf(“A ordem crescente: %d %d %dn”, n2, n3, n1);
if (n1 < n2)
if (n3 < n1)
printf(“A ordem crescente: %d %d %dn”, n3, n1, n2);
else if (n3 < n2)
printf(“A ordem crescente: %d %d %dn”, n1, n3, n2);

return 0;
}

/*
* SOLUCAO 3. Igual a solucao 2 com alguns parenteses superfluos que
* devem ajudar a leitura do programa (evitar ambiguida).
*
*/

#include <stdio.h>

int main()
{
int n1, n2, n3; /* dados de entrada */

printf(“Digite tres numeros: “);
scanf(“%d”, &n1);
scanf(“%d”, &n2);
scanf(“%d”, &n3);

if (n3 > n1)
{
if (n1 > n2)
{
printf(“A ordem crescente: %d %d %dn”, n2, n1, n3);
}
else
{
if (n2 < n3)
{
printf(“A ordem crescente: %d %d %dn”, n1, n2, n3);
}
}
}

if (n1 > n2)
{
if (n2 > n3)
{
printf(“A ordem crescente: %d %d %dn”, n3, n2, n1);
}
else
{
if (n3 < n1)
{
printf(“A ordem crescente: %d %d %dn”, n2, n3, n1);
}
}
}

if (n1 < n2)
{
if (n3 < n1)
{
printf(“A ordem crescente: %d %d %dn”, n3, n1, n2);
}
else
{
if (n3 < n2)
{
printf(“A ordem crescente: %d %d %dn”, n1, n3, n2);
}
}
}
return 0;
}

/*
* SOLUCAO 4. Parecida com a solucao 1. Usa condicoes simples,
* ou seja, sem && e ||.
*
*/

#include <stdio.h>

int main()
{
int n1, n2, n3; /* dados de entrada */

printf(“Digite tres numeros: “);
scanf(“%d %d %d”, &n1, &n2, &n3);

/* Existem 6 possiveis ordens para imprimior os numeros lidos */
if (n1 <= n2)
{ /* n1 <= n2 */
if (n2 <= n3)
{ /* n1 <= n2 e n2 <= n3 */
printf(“A ordem crescente: %d %d %dn”, n1, n2, n3);
}
else
{ /* n1 <= n2 e n3 < n2 */
if (n1 <= n3)
{ /* n1 <= n3 e n3 < n2 */
printf(“A ordem crescente: %d %d %dn”, n1, n3, n2);
}
else
{ /* n3 < n1 e n1 <= n2 */
printf(“A ordem crescente: %d %d %dn”, n3, n1, n2);
}
}
}
else
{ /* n2 < n1 */
if (n1 <= n3)
{ /* n2 < n1 e n1 <= n3 */
printf(“A ordem crescente: %d %d %dn”, n2, n1, n3);
}
else
{ /* n2 < n1 e n3 < n1 */
if (n2 <= n3)
{ /* n2 <= n3 e n3 < n1 */
printf(“A ordem crescente: %d %d %dn”, n2, n3, n1);
}
else
{ /* n3 < n2 e n2 < n1 */
printf(“A ordem crescente: %d %d %dn”, n3, n2, n1);
}
}
}

return 0;
}

/*
* SOLUCAO 5. Variante da solucao 4. Usa condicoes simples,
* ou seja, sem && e ||.
*
*/

#include <stdio.h>

int main()
{
int n1, n2, n3; /* dados de entrada */
int aux; /* auxiliar para troca de conteudod e variveis */
printf(“Digite tres numeros: “);
scanf(“%d %d %d”, &n1, &n2, &n3);

/* Forca que n1 <= n2 */

if (n1 > n2)
{
/* troca o conteudo das variaveis n1 e n2 */
aux = n1;
n1 = n2;
n2 = aux;
}

/* Neste ponto do programa vale que n1 <= n2 */
if (n2 <= n3)
{ /* n1 <= n2 e n2 <= n3 */
printf(“A ordem crescente: %d %d %dn”, n1, n2, n3);
}
else
{ /* n1 <= n2 e n3 < n2 */
if (n1 <= n3)
{ /* n1 <= n3 e n3 < n2 */
printf(“A ordem crescente: %d %d %dn”, n1, n3, n2);
}
else
{ /* n3 < n1 e n1 <= n2 */
printf(“A ordem crescente: %d %d %dn”, n3, n1, n2);
}
}
return 0;
}
[/C]