-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMergeSort.java
More file actions
67 lines (57 loc) · 1.46 KB
/
MergeSort.java
File metadata and controls
67 lines (57 loc) · 1.46 KB
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
import java.util.*;
public class MergeSort {
void merge(ArrayList<Integer> pin,int l, int m, int r)
{
int n1= m-l+1;//μεγεθος πρωτου υποπινακα
int n2=r-m;//μεγεθος πρωτου υποπινακα
int Pl[]=new int [n1];
int Pr[]=new int [n2];
for(int i=0;i<n1;i++)
{
Pl[i]=pin.get(l+i);//γεμιζουμε τον υποπινακα με το στοιχεια της λιστας
}
for(int j=0;j<n2;j++)
{
Pr[j]=pin.get(m+1+j);//γεμιζουμε τον υποπινακα με το στοιχεια της λιστας
}
int i=0;
int j=0;
int k=l;
while(i<n1 && j<n2)//οσο και οι δυο υποπινακες εχουν στοιχεια
{
if(Pl[i]<Pr[j])//βαζουμε τον μεγαλυτερο αριθμο απο τους δυο υποπινακες
{
pin.set(k, Pl[i]);
i++;
}
else
{
pin.set(k, Pr[j]);
j++;
}
k++;
}
while(i<n1)//οταν τελειωσει ο πινακας 2 μεταφερουμε τα στοιχεια του πρωτου(ταξινομιμενου) υποπινακα στην λιστα
{
pin.set(k,Pl[i]);
k++;
i++;
}
while(j<n2)//οταν τελειωσει ο πινακας 1 μεταφερουμε τα στοιχεια του δευτερου(ταξινομιμενου) υποπινακα στην λιστα
{
pin.set(k,Pr[j]);
k++;
j++;
}
}
void sort(ArrayList<Integer> pin, int start,int end)
{
if(start<end)//μεχρι να χωριστει ο πινακας σε υποπινακες του ενος στοιχειου
{
int mid=(start+end)/2;
sort(pin,start, mid);//αναδρομικη κληση της sort για τον αριστερο υποπινακα
sort(pin, mid+1, end);//αναδρομικη κληση της sort για τον αριστερο υποπινακα
merge(pin,start,mid,end);//κληση της merge για να ενωθουν οι δυο υποπινακες
}
}
}