-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmerge_sort.cpp
129 lines (114 loc) · 2.48 KB
/
merge_sort.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
using namespace std;
int *merge(int *puntero1, int *puntero2,int tam1, int tam2)
{
int *ptr_final=new int[tam1+tam2];
int p1=0;
int p2=0;
int p3=0;
while (tam1>0 and tam2>0)
{
if (*(puntero1+p1)<=*(puntero2+p2))
{
*(ptr_final+p3)=*(puntero1+p1);
p3+=1;
p1+=1;
tam1-=1;
}
else
{
*(ptr_final+p3)=*(puntero2+p2);
p3+=1;
p2+=1;
tam2-=1;
}
}
while (tam1>0)
{
*(ptr_final+p3)=*(puntero1+p1);
p1+=1;
p3+=1;
tam1-=1;
}
while (tam2>0)
{
*(ptr_final+p3)=*(puntero2+p2);
p2+=1;
p3+=1;
tam2-=1;
}
return ptr_final;
}
int* merge_sort(int *puntero_lista,int tam)
{
if (tam<=1)
{
int *punt_lista2=new int[1];
*(punt_lista2)=*(puntero_lista);
//cout<<"uno: "<<*(punt_lista2)<<endl;
return punt_lista2;
}
else
{
int *resultado=new int[tam];
int medio=tam/2;
int *left=new int[medio];
int *right=new int[tam-medio];
int i=0;
for (int j=0;i<medio;i++,j++)
{
*(left+i)=*(puntero_lista+i);
}
for(int k=0;i<tam;k++,i++)
{
*(right+k)=*(puntero_lista+i);
}
left=merge_sort(left,medio);
right=merge_sort(right,tam-medio);
/*if (*(left+medio-1)<=*(right))
{
int r=0;
for (int i=0;i<medio;i++,r++)
{
*(resultado+r)=*(left+i);
}
for(int k=0;r<tam;k++,r++)
{
*(resultado+r)=*(right+k);
}
return resultado;
}*/
resultado=merge(left,right,medio,tam-medio);
/*for (int i=0;i<tam;i++)
{
cout<<*(resultado+i)<<endl;
}*/
return resultado;
}
}
int main()
{
int tam;
cin>>tam;
int lista[tam];
int temp;
srand(time(NULL));
for(int i=0;i<tam;i++)
{
temp=rand()%tam;
lista[i]=temp;
}
cout<<"Lista: "<<endl;
for(int i=0;i<tam;i++)
{
cout<<lista[i]<<endl;
}
int *ptr_lista=lista;
//int* listafinal=merge(puntero_lista2,puntero_lista3,4,4);
int *listafinal=merge_sort(ptr_lista,tam);
cout<<"\nLista ordenada: "<<endl;
for (int i=0;i<tam;i++)
{
cout<<*(listafinal+i)<<endl;
}
}