Mergesort
parent
df9946e2ad
commit
824bc188db
|
|
@ -1,4 +1,5 @@
|
|||
import java.util.logging.Logger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class SortAlgo {
|
||||
|
|
@ -29,11 +30,6 @@ public class SortAlgo {
|
|||
|
||||
System.out.println();
|
||||
|
||||
int[] erg4 = mergesort(insert);
|
||||
for (int i = 0; i < erg4.length;i++)
|
||||
System.out.print(erg4[i] + " ");
|
||||
|
||||
System.out.println();
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -92,9 +88,59 @@ public class SortAlgo {
|
|||
return arr;
|
||||
}
|
||||
|
||||
public static int[] mergesort (int[] arr) { // O(n*log2(n))
|
||||
|
||||
return arr;
|
||||
public class Mergesort {
|
||||
private static final Logger log = Logger.getLogger(Mergesort.class.getName());
|
||||
private int forcounts = 0;
|
||||
public int[] sort(int[] arr) {
|
||||
if(arr.length == 0) {
|
||||
return new int[0];
|
||||
}
|
||||
int[] sorted = new int[arr.length];
|
||||
ArrayList<Integer[]> subArrays = new ArrayList<Integer[]>();
|
||||
for(int i = 0; i < arr.length; i++) {
|
||||
subArrays.add(new Integer[] {arr[i]});
|
||||
}
|
||||
while(subArrays.size() > 1) {
|
||||
ArrayList<Integer[]> newSubArrays = new ArrayList<Integer[]>();
|
||||
for(int i = 0; i<subArrays.size(); i=i+2) {
|
||||
if(i+1 < subArrays.size()) {
|
||||
newSubArrays.add(mergeTwoSubArrays(subArrays.get(i),subArrays.get(i+1)));
|
||||
} else {
|
||||
newSubArrays.add(subArrays.get(i));
|
||||
}
|
||||
}
|
||||
subArrays = newSubArrays;
|
||||
}
|
||||
for(int i = 0; i<subArrays.get(0).length; i++) {
|
||||
sorted[i] = subArrays.get(0)[i];
|
||||
}
|
||||
log.log(Level.INFO, "Mergesort: " + forcounts);
|
||||
return sorted;
|
||||
}
|
||||
private Integer[] mergeTwoSubArrays(Integer[] arr1, Integer[] arr2) {
|
||||
if(arr1.length == 0) {
|
||||
return arr2;
|
||||
}
|
||||
if(arr2.length == 0) {
|
||||
return arr1;
|
||||
}
|
||||
Integer[] ret = new Integer[arr1.length+arr2.length];
|
||||
int index1 = 0;
|
||||
int index2 = 0;
|
||||
for(int i = 0; i < arr1.length+arr2.length; i++) {
|
||||
forcounts++;
|
||||
if(index1 >= arr1.length) {
|
||||
ret[i] = arr2[index2++];
|
||||
} else if(index2 >= arr2.length) {
|
||||
ret[i] = arr1[index1++];
|
||||
} else if(arr1[index1] <= arr2[index2]) {
|
||||
ret[i] = arr1[index1++];
|
||||
} else {
|
||||
ret[i] = arr2[index2++];
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue