galloping

This commit is contained in:
2021-01-02 12:49:11 +01:00
parent b38b75cb23
commit b87da63d8c

View File

@ -8,23 +8,25 @@ public class timsort {
int[] output = new int[unsorted.length];
output[0] = unsorted[0];
for(int i = 1; i < unsorted.length; ++i) {
int minIndex = 0;
int maxIndex = i;
for(int j = maxIndex - 1; minIndex != maxIndex; j = minIndex + (maxIndex - minIndex) / 2) {
if(unsorted[i] >= output[j]) {
minIndex = j + 1;
}
else {
maxIndex = j;
}
}
for(int j = i; j > minIndex; --j) {
int foundIndex = binarySearch(output, unsorted[i], 0, i);
for(int j = i; j > foundIndex; --j) {
output[j] = output[j - 1];
}
output[minIndex] = unsorted[i];
output[foundIndex] = unsorted[i];
}
return output;
}
private static int binarySearch(int[] array, int search, int minIndex, int maxIndex) {
for(int j = maxIndex - 1; minIndex != maxIndex; j = minIndex + (maxIndex - minIndex) / 2) {
if(search >= array[j]) {
minIndex = j + 1;
}
else {
maxIndex = j;
}
}
return minIndex;
}
public static int[] timsort(int[] unsorted) {
int r = 0;
// r becomes 1 any 1 bits are shifted off
@ -79,11 +81,21 @@ public class timsort {
int[] j = new int[2];
int w = 0;
int l = 0;
for(; j[w] < notMerged[i + w].length; ++l) {
for(int gallopingCounter = 0; j[w] < notMerged[i + w].length; ++l) {
if(gallopingCounter == 7) {
int b = w != 0 ? 0 : 1;
int found = binarySearch(notMerged[i + w], notMerged[i + b][j[b]], j[w], notMerged[i + w].length - 1);
for(; j[w] < found; ++j[w], ++l) {
temp[l] = notMerged[i + w][j[w]];
}
}
int lastW = w;
w = notMerged[i][j[0]] > notMerged[i + 1][j[1]] ? 1 : 0;
System.out.println("w: " + w);
temp[l] = notMerged[i + w][j[w]];
++j[w];
if(w == lastW) ++gallopingCounter;
else gallopingCounter = 0;
}
int b = w != 0 ? 0 : 1;
for(int k = j[b]; l < temp.length; ++k, ++l) {