semestre_2/Algoritmos e Estruturas de .../Semana 03/sort.c

91 lines
2.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct {
int size, * value;
} Array;
Array * initializeArray () {
Array * init = malloc(sizeof(*init));
init->size = 1;
init->value = malloc(sizeof(init->value));
return init;
}
int readSequence(Array * sequence) {
bool end = false;
int num, i = 0;
char c;
do {
switch (scanf("%d%c", &num, &c)) {
case 0:
return EOF;
case EOF:
end = true;
}
if (end == true)
break;
if (i == sequence->size - 1) {
sequence->size *= 2;
sequence->value = realloc(sequence->value, sequence->size * sizeof(sequence->value));
}
sequence->value[i] = num;
i++;
} while(c != '\n');
sequence->size = i;
return i;
}
bool isSorted (Array * sequence) {
int i;
for (i = 0; i < sequence->size - 1; i++)
if (sequence->value[i] > sequence->value[i + 1])
return false;
return true;
}
void selectionSort(Array * sequence) {
int i, j, pos, aux;
if (isSorted(sequence) == true)
return;
for (i = 0; i < sequence->size - 1; i++) {
pos = i;
for (j = i + 1; j < sequence->size; j++)
if (sequence->value[j] < sequence->value[pos])
pos = j;
if (pos == i)
continue;
aux = sequence->value[i];
sequence->value[i] = sequence->value[pos];
sequence->value[pos] = aux;
}
}
int main () {
int i;
Array * sequence = initializeArray();
printf("Este programa lê uma sequência de números inteiros e os ordena em ordem crescente. Digite uma sequência de números qualquer e pressione ENTER:\n");
switch (readSequence(sequence)) {
case EOF:
printf("Detectado valor inválido na sequência\n");
case 0:
return 1;
}
selectionSort(sequence);
printf("\n");
for (i = 0; i < sequence->size; i++)
printf("%d ", sequence->value[i]);
printf("\n");
return 0;
}