Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Yuri Serrano

Sub-Dividindo o Vetor

Recommended Posts

Boa tarde Senhores

 

Estou tentando fazer uma versão do merge sort que ao invés de sub-dividir o vetor em dois acaba por subdividi-lo em três só que ele esta tendo alguns problemas ,creio eu na intercala como não consigo ver mais o erro poderiam me ajudar por gentileza a tentar detectá-lo ,desde já agradeço a atenção de todos,segue abaixo o código do mesmo:

 

 

 
/******************Bibliotecas**************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
#define MAX 500000
 
/*Auxilia no processo de ordenação
 *do MergeSort
*/
void Intercala(int v[],int inicio,int meio1,int meio2,int fim);
/*Ordena os dados crescentemente
 *Possui no pior caso complexidade O(nlogn)
*/
void Merge_Sort(int v[],int inicio,int fim);
 
 
void numero_aleatorio(int vet[],int *n,int max,time_t t);
/*Função para a impressão do vetor*/
void imprimir_vetor(int vet[],int n);
//////////////////////////////////////////////////////////////////////////////////
int main()
{
    setlocale(LC_ALL,"Portuguese");
 
    time_t t;
    time_t t1,t2;
    t=time(NULL);  
    int vet[MAX];
  int max=0;
  int tGasto=0;
  int tam=0,merge=0;
  max=MAX;
  printf("***********************Ordenando o Vetor***************************\n");
  numero_aleatorio(vet,&tam,max,t);
  imprimir_vetor(vet,tam);
  t1=time(NULL);
  Merge_Sort(vet,1,tam);
  t2=time(NULL);
  tGasto=t2-t1;  
  printf("O Tempo Gasto pelo  MergeSort foi :%d segundos \n\n",tGasto);
  merge=tGasto;
  printf("MergeSort:%d segundos\n",merge);
  imprimir_vetor(vet,tam);
  system("PAUSE");
    return (0);  
}
 
void Intercala(int v[],int inicio,int meio1,int meio2,int fim)
{
int i=0,j=0,k=0,l=0,*w;
w=(int*)malloc((fim-inicio)*sizeof(int));
i=inicio;
j=meio1;
l=meio2;
k=0;
while(i<meio1&&j<meio2)
{
if(v[i]<=v[j])
w[k++]=v[i++];
else
w[k++]=v[j++];
}
while(j<meio1&&l<fim)
{
if(v[j]<=v[l])
w[k++]=v[j++];
else
w[k++]=v[l++];
}
while(i<meio1)
w[k++]=v[i++];
while(j<meio2)
w[k++]=v[j++];
while(l<fim)
w[k++]=v[l++];
for(i=inicio;i<fim;i++)
v[i]=w[i-inicio];
free(w);
}
void Merge_Sort(int v[],int inicio,int fim)
{
int meio1,meio2;
if(inicio<fim-1)
{
meio1=(inicio+fim)/3;
meio2=meio1*2;
Merge_Sort(v,inicio,meio1);
Merge_Sort(v,meio1,meio2);
Merge_Sort(v,meio2,fim);
Intercala(v,inicio,meio1,meio2,fim);
}
}
 
void numero_aleatorio(int vet[],int *n,int max,time_t t)
{
int i=0,j=0,l=0;
srand(t);
printf("Digite o tamanho do vetor:");
scanf("%d",n);
for(j=1;;j++)
{
if(*n>max)
{
printf("Digite o tamanho do vetor:");
scanf("%d",&n);
}
else
{
break;
}
}
l=*n;
printf("::Elementos do Vetor Gerados Randomicamente::\n");
for(i=0;i<l;i++)
{
vet[i]=rand ();
 
}
}
void imprimir_vetor(int vet[],int n)
{
int i=1;
for(i=0;i<n;i++)
{
printf("O valor do vetor[%d]:%d\n",i,vet[i]);
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parei de ler depois que vi uma função abaixo da main() e código sem "Enters".

 

A prática de separar as linhas de "assuntos" diferentes com "Enter" e sempre manter funções acima de onde está a main() facilita a boa interpretação do código e, consequentemente, o encontro mais ágil de bugs/erros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.