Preciso de Ajuda pra criar um Algoritmo de Sort em C

1. Preciso de Ajuda pra criar um Algoritmo de Sort em C

Apprentice X
ApprenticeX

(usa Slackware)

Enviado em 24/01/2022 - 19:00h

Boa Noite a todos!

Criei um Algoritmo de Sort que me permite dar Sort em qualquer coluna de uma Struct. OK
Agora eu quero dar Sort em 2 Colunas ao mesmo tempo, ou seja a Coluna 2 terá Sort baseado no Sort da Coluna 1 por exemplo!
OBS Meu sort mantem a regra de linhas, ou seja 1 Linha contem o texto de cada coluna! então não são colunas independentes! cada Linha é 1 Registro!
Exemplo de Struct com 5 Registros e as 3 colunas: Text1, Text2, Text3

Meu Sort funciona comparando a Coluna Escolhida, exemplo a Coluna Text1. Então eu comparo a 1a Linha com a Linha debaixo e reposiciono conforme a ordem. Reposicionando também claro as outras colunas para que não bagunçem o Registro
Esse meu Sistema já é bastante confuso de entender, visto que uso 2 for de varredura e mais 3 operações movendo os textos

Se alguém conhecer um algoritmo de sort com source (Pra eu Estudar), que permita eu ordenar por exemplo: Text1, seguido de Text2 ou seja Text2 estaria em Sort comparado a Text1.

Ou se alguém tiver alguma idéia mais simples que meu sistema de comparação também ajuda!

Atualmente a única idéia que eu tenho que ainda não implementei mas sei que é complexa será: incluir no meu sort uma comparação EXTRA no meio do Sort atual, tipo varrendo a 2a Coluna inteira e Ordenando pra cada linha da 1a Coluna que eu já esteja Ordenando!

Ou seja, é uma Complexidade Enorme. Mas dá pra fazer!
Eu estou raciocinando errado?
Existe uma forma mais simples?
Ou minha idéia é a correta de se fazer um Sort?

Porque se minha idéia é correta e normal, tudo bem, vou fazer! Apenas não quero estar no caminho errado!
Obrigado todos que puderem expressar sua opinião!


  


2. Re: Preciso de Ajuda pra criar um Algoritmo de Sort em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/01/2022 - 17:23h

Se eu entendi corretamente, você quer que, no fim das contas, o campo 1 tenha uma prioridade de ordenação mais alta do que os campos 2 e 3, e, se houver empate no campo 1, o campo 2 seja usado para desempate, e, se ainda houver empate, o campo 3 seja usado como critério final. É isso?

Se for isso, e supondo que todos os campos são strings, você poderia ter uma função de comparação parecida com a seguinte.
// Compara dois registros Supondo que todos os campos ‘r1’ e ‘r2’, retornando, tal como strcmp(), um valor negativo se r1 tiver de vir antes de r2,
// nulo se forem equivalentes, e positivo se r2 tiver de vir antes de r1. A comparação é feita primeiro sobre o ‘campo1’ de cada registro; o ‘campo2’ só é
// testado se ‘campo1’ for igual em ambos, e o ‘campo3’ só é testado se ‘campo2’ também for igual em ambos.
int compara_1_2_3(const struct registro *r1, const struct registro *r2){
int diff=strcmp(r1->campo1, r2->campo1);
if(diff==0) diff=strcmp(r1->campo2, r2->campo2);
if(diff==0) diff=strcmp(r1->campo3, r2->campo3);
return diff;
}


É algo assim que você queria?

Essa função (ou algo semelhante) pode ser usada como critério de comparação em qualquer algoritmo de ordenação.

... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)