-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMergeSort.java
More file actions
97 lines (73 loc) · 2.6 KB
/
MergeSort.java
File metadata and controls
97 lines (73 loc) · 2.6 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
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
import java.util.Random;
public class MergeSort {
public static void main(String[] args){
Random rand = new Random();
int[] numbers = new int[10];
for(int i = 0; i < numbers.length; i++){
numbers[i] = rand.nextInt(1000000);
}
System.out.println("Antes: ");
printArray(numbers);
mergeSort(numbers);
System.out.println("\nDespués: ");
printArray(numbers);
}
public static void mergeSort(int[] inputArray){
int inputLength = inputArray.length;
//Si el tamaño del array es menos de dos, no hay comparación necesaria ni posible. Está ordenado
if(inputLength < 2){
return;
}
//Dividimos el Array inicial en dos arrays más simples.
int midIndex = inputLength/2;
//Determino el tamaño de cada sub array
int[] leftHalf = new int[midIndex];
int[] rightHalf = new int[inputLength - midIndex];
//Copio los elementos del array original en el sub array de la izquierda
for(int i = 0; i < midIndex; i++){
leftHalf[i] = inputArray[i];
}
for(int i = midIndex; i < inputLength; i++){
//Quiero que comience a recorrer desde el nuevo 0.
rightHalf[i - midIndex] = inputArray[i];
}
//Llamo recursivamente al método para que repita el proceso para ambos sub arrays
mergeSort(leftHalf);
mergeSort(rightHalf);
//Llamo a merge
merge(inputArray, leftHalf, rightHalf);
}
private static void merge(int[] inputArray, int[] leftHalf, int[] rightHalf){
int leftSize = leftHalf.length;
int rightSize = rightHalf.length;
//Necesitaré una variable para lada tramo del array, con ella compararé posiciones en el inicio,
// el final y el dato ordenado del array.
int i = 0, j = 0, k = 0;
while(i < leftSize && j < rightSize){
if(leftHalf[i] <= rightHalf[j]){
inputArray[k] = leftHalf[i];
i++;
}else{
inputArray[k] = rightHalf[j];
j++;
}
k++;
}
while(i < leftSize){
inputArray[k] = leftHalf[i];
i++;
k++;
}
while(j < rightSize){
inputArray[k] = rightHalf[j];
j++;
k++;
}
}
public static void printArray(int[] numbers){
for(int i = 0; i < numbers.length; i++){
//Imprime en cada iteración de numbers
System.out.println(numbers[i]);
}
}
}