#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct{
int* vet;
char** vetNome;
}Teste;
void mergeSort(Teste, int, int );
void intercala(Teste, int, int , int);
void bubbleSort(Teste test, int tamanho);
int pesquisaBin(Teste, char* chave, int, int);
int main(){
Teste test;
test.vetNome = malloc(sizeof(char*) * 7);
for (int i = 0; i < 100; i++){
test.vetNome[i] = malloc(sizeof(char) *100);
}
strcpy(test.vetNome[0],"Aberlado Barbosa\n");
strcpy(test.vetNome[1], "José Frances\n");
strcpy(test.vetNome[2], "Barbara Vitoria\n");
strcpy(test.vetNome[3], "Maria Silva\n");
strcpy(test.vetNome[4], "Bia Menezes\n");
strcpy(test.vetNome[5], "Samile Tania\n");
strcpy(test.vetNome[6], "Maria Souza\n");
test.vet = malloc(sizeof(int) * 5);
int k = 0;
for (int i = 4; i >= 0; i--){
test.vet[k] = i;
k++;
}
mergeSort(test,0,6);
//bubbleSort(test,5);
int pos = pesquisaBin(test, "José Frances\n", 0, 6);
for (int i = 0; i < 7; i++){
printf("posição %d, nome: %s\n",i,test.vetNome[i] );
}
printf(" Posicao de José: %d\n", pos);
return 0;
}
// ordenação com merge sort
void mergeSort(Teste test, int inicio, int fim){
if(inicio < fim){
int meio = ((inicio + fim)/2);
mergeSort(test, inicio, meio);
mergeSort(test, meio + 1, fim);
intercala(test, inicio, meio, fim);
}
}
void intercala(Teste test, int inicio, int meio, int fim){
int tamanho;
int i, j, k, esq, dir;
int fimEsq = 0, fimDir = 0;
tamanho = fim -inicio + 1;
esq = inicio;
dir = meio + 1;
char** vetOrdenado;
vetOrdenado = malloc(sizeof(char*) * tamanho);
for (int l = 0; l < tamanho; l++){
vetOrdenado[l] = malloc(sizeof(char) *100);
}
if(vetOrdenado != NULL){
for(i = 0; i < tamanho; i++){
int tam1 = strlen(test.vetNome[esq]);
int tam2 = strlen(test.vetNome[dir]);
int tamMax;
if(tam1>tam2){
tamMax = tam1;
}else{
tamMax = tam2;
}
if(!fimEsq && !fimDir){
if(strncmp(test.vetNome[esq], test.vetNome[dir], tamMax) < 0)
strcpy(vetOrdenado[i], test.vetNome[esq++]);
else
strcpy(vetOrdenado[i], test.vetNome[dir++]);
if(esq > meio)
fimEsq = 1;
if(dir > fim)
fimDir = 1;
}else{
if(!fimEsq)
strcpy(vetOrdenado[i], test.vetNome[esq++]);
else
strcpy(vetOrdenado[i], test.vetNome[dir++]);
}
}
}
for(j=0, k = inicio; j < tamanho;j++, k++){
strcpy(test.vetNome[k], vetOrdenado[j]);
}
}
//ordernação com bubble sort
void bubbleSort(Teste test, int tamanho){
int i, continua, fim = tamanho;
char* aux = malloc(sizeof(char)*50);
do{
continua = 0;
for (i = 0; i < tamanho-1; i++){
int tam1 = strlen(test.vetNome[i]);
int tam2 = strlen(test.vetNome[i+1]);
int tamMax;
if(tam1>tam2){
tamMax = tam1;
}else{
tamMax = tam2;
}
if(strncmp(test.vetNome[i], test.vetNome[i+1], tamMax) > 0){
strcpy(aux,test.vetNome[i]);
strcpy(test.vetNome[i],test.vetNome[i+1]);
strcpy(test.vetNome[i+1],aux);
continua=i;
}
}
fim--;
}while(continua!=0);
}
// pesquisa binária de strings
int pesquisaBin(Teste test, char* chave, int esq, int dir){
int m;
int tamanho = strlen(chave);
if(strncmp(test.vetNome[esq], chave, tamanho) == 0){
return esq;
}else if(strncmp(test.vetNome[dir], chave, tamanho) == 0){
return dir;
}else{
m = (esq + dir)/2;
if(strncmp(test.vetNome[m], chave, tamanho) < 0){
pesquisaBin(test, chave, m + 1, dir);
}else{
pesquisaBin(test, chave, esq, m - 1);
}
}
}
usei strncmp @arfneto assim como tinha dito para o@devair1010 , ele era bom ver casos de nomes iguais e sobrenomes diferentes. Ai tem as versões de ordenação bubble e merge, assim como busca binária. E o tempo de execução do merg é melhor no pior caso do que o pior caso do bubble :). Muito obrigada, pessoal!! Espero ajudar quem precisa