summaryrefslogtreecommitdiffstats
path: root/converter/cQuicksort.cpp
diff options
context:
space:
mode:
authoradmin@omencraft.com <admin@omencraft.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2011-11-04 17:27:11 +0100
committeradmin@omencraft.com <admin@omencraft.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2011-11-04 17:27:11 +0100
commit563028f6dbaad33152a873ca68f4b619839a9589 (patch)
tree37de244a7e14441b58f55ad904e502e51f2ab163 /converter/cQuicksort.cpp
parentAdded cRedstone to project file (diff)
downloadcuberite-563028f6dbaad33152a873ca68f4b619839a9589.tar
cuberite-563028f6dbaad33152a873ca68f4b619839a9589.tar.gz
cuberite-563028f6dbaad33152a873ca68f4b619839a9589.tar.bz2
cuberite-563028f6dbaad33152a873ca68f4b619839a9589.tar.lz
cuberite-563028f6dbaad33152a873ca68f4b619839a9589.tar.xz
cuberite-563028f6dbaad33152a873ca68f4b619839a9589.tar.zst
cuberite-563028f6dbaad33152a873ca68f4b619839a9589.zip
Diffstat (limited to 'converter/cQuicksort.cpp')
-rw-r--r--converter/cQuicksort.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/converter/cQuicksort.cpp b/converter/cQuicksort.cpp
new file mode 100644
index 000000000..8a00805eb
--- /dev/null
+++ b/converter/cQuicksort.cpp
@@ -0,0 +1,67 @@
+#include "cQuicksort.h"
+#include <ctype.h>
+
+
+
+// Quicksort controller function, it partitions the different pieces of our array.
+void cQuicksort::quicksort(int *arIntegers, int left, int right)
+{
+ if (right > left)
+ {
+ int pivotIndex = median3(arIntegers,left,right);
+ int pivotNewIndex = partition(arIntegers, left, right, pivotIndex);
+
+ // Recursive call to quicksort to sort each half.
+ quicksort(arIntegers, left, pivotNewIndex-1);
+ quicksort(arIntegers, pivotNewIndex+1, right);
+ }
+}
+
+int cQuicksort::median3(int *arIntegers,int left,int right)
+{
+ int center = (left+right)/2;
+
+ if(arIntegers[center] < arIntegers[left])
+ swap(arIntegers[left],arIntegers[center]);
+ if(arIntegers[right] < arIntegers[left])
+ swap(arIntegers[left],arIntegers[right]);
+ if(arIntegers[right] < arIntegers[center])
+ swap(arIntegers[center],arIntegers[right]);
+
+ swap(arIntegers[center],arIntegers[right-1]);
+
+ return center;
+}
+
+// This function takes an array (or one half an array) and sorts it.
+// It then returns a new pivot index number back to quicksort.
+int cQuicksort::partition(int *arIntegers, int left, int right, int pivot)
+{
+ int pivotValue = arIntegers[pivot];
+
+ // Swap it out all the way to the end of the array
+ // So we know where it always is.
+ swap(arIntegers[pivot], arIntegers[right]);
+ int storeIndex = left;
+
+ // Move through the array from start to finish comparing each to our
+ // pivot value (not index, the value that was located at the pivot index)
+ for (int i = left; i < right; i++)
+ {
+ if (arIntegers[i] <= pivotValue)
+ {
+ swap(arIntegers[i], arIntegers[storeIndex]);
+ storeIndex++;
+ }
+ }
+ swap(arIntegers[storeIndex], arIntegers[right]);
+ return storeIndex;
+}
+
+// Simple swap function for our in place swapping.
+void cQuicksort::swap(int &val1, int &val2)
+{
+ int temp = val1;
+ val1 = val2;
+ val2 = temp;
+}