Jump to content

[Resolvido] Ordenar


AJBM

Recommended Posts

Boas!

Eu tenho que ordenar um array de alunos pelo bi, o que eu tenho feito para já é isto

EstruturaPrincipal ordenar(EstruturaPrincipal ePrincipal) {

unsigned i, j;
Aluno temp;

for (i = 0; i < ePrincipal.countAlunos - 2; i++) {
	for (j = 0; j < ePrincipal.countAlunos - 2 - i; j++) {
		if (ePrincipal.alunos[j].bi > ePrincipal.alunos[j + 1].bi) {
			temp = ePrincipal.alunos[j];
			ePrincipal.alunos[j] = ePrincipal.alunos[j + 1];
			ePrincipal.alunos[j + 1] = temp;
		}
	}
}
return ePrincipal;
}

Mas sempre que eu executo este código a aplicação vai abaixo.

Link to comment
Share on other sites

Boas!

Ja funciona só que acho que o algoritmo de ordenação esta mal implementado, porque se o meu array Alunos tiver 2 alunos não ordena mas se tiver 3 já ordena, mas não fica bem ordenado, eu adicionei 3 alunos, o primeiro adicionar tinha bi 12, segundo bi 1 terceiro bi 2, o resultado após a ordenação é aluno com bi1 aluno com bi12 aluno com bi2

Edited by AJBM
Link to comment
Share on other sites

ok, tens agora de praticar a executar o código na cabeça.

eu vou escrever aqui o que está a acontecer para ver como deves pensar:

// INÍCIO
// nota : ePrincipal.countAlunos = 3
for (i = 0;                                  // i = 0, j = lixo
    i < ePrincipal.countAlunos - 2;         // i < 3 - 2 >> 0 < 1 >> verdadeiro
    i++) {
 for (j = 0;                                // i = 0, j = 0
      j < ePrincipal.countAlunos - 2 - i;   // j < 3 - 2 - 0 >> 0 < 1 >> verdadeiro
      j++) {                                // no final : j = j + 1 >> j = 1
 }
 //------------------------------
 // segundo cíclo do for interior
 //------------------------------
 for (j = 0;                                // ignorar (só executado no início do ciclo)
      j < ePrincipal.countAlunos - 2 - i;   // j < 3 - 2 - 0 >> 1 < 1 >> falso
      j++) {                                // ignorar (só executado no fim da execução do bloco de instruções)
 }
//------------------------------
// segundo cíclo do for exterior
//
// nota : i = i + 1 > i = 2 (código a ser executado no fim da execução do bloco de instruções)
//------------------------------
for (i = 0;                                  // ignorar (só executado no início do ciclo)
    i < ePrincipal.countAlunos - 2;         // i < 3 - 2 >> 1 < 1 >> false
    i++) {                                  // ignorar (só executado no fim da execução do bloco de instruções)

como vês, tanto o ciclo interior e o exterior só é executado 1 única vez para uma lista de 3 elementos

por esta ordem de ideias :

2 elemento >> 0 vezes

3 elementos >> 1 vez

4 elementos >> 2 vezes

5 elementos >> 3 vezes

6 elementos >> 4 vezes

como podes verificar, irá sempre faltar 1 verificação nos dois ciclos

agora altera de acordo a efectuar as verificações necessárias

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.