summaryrefslogtreecommitdiff
path: root/test-chill/unit-tests/cprog/MergeSorter.cc
diff options
context:
space:
mode:
authordhuth <derickhuth@gmail.com>2014-09-17 18:09:29 -0600
committerdhuth <derickhuth@gmail.com>2014-09-17 18:09:29 -0600
commit600fa18324c21a162c50c40ae5f00c899a41dd24 (patch)
treed399a8ea49c71a85abf5c07cb96b24676df32a0a /test-chill/unit-tests/cprog/MergeSorter.cc
parenta2bd0557344bbd8d06e94814abd409f552b0efec (diff)
downloadchill-600fa18324c21a162c50c40ae5f00c899a41dd24.tar.gz
chill-600fa18324c21a162c50c40ae5f00c899a41dd24.tar.bz2
chill-600fa18324c21a162c50c40ae5f00c899a41dd24.zip
removed submodule, added test-chill
Diffstat (limited to 'test-chill/unit-tests/cprog/MergeSorter.cc')
-rw-r--r--test-chill/unit-tests/cprog/MergeSorter.cc77
1 files changed, 77 insertions, 0 deletions
diff --git a/test-chill/unit-tests/cprog/MergeSorter.cc b/test-chill/unit-tests/cprog/MergeSorter.cc
new file mode 100644
index 0000000..6e747a3
--- /dev/null
+++ b/test-chill/unit-tests/cprog/MergeSorter.cc
@@ -0,0 +1,77 @@
+#include "MergeSorter.h"
+
+/* Python
+def msort(lst, start, end, pindent = 0):
+ if start == end:
+ return
+ center = start + ((end - start) // 2)
+ print(' '*pindent + "SPLIT {}|{}".format(lst[start:center+1], lst[center+1:end+1]))
+ msort(lst, start, center, pindent+1)
+ msort(lst, center+1, end, pindent+1)
+ left = list(lst[start:center+1])
+ right = list(lst[center+1:end+1])
+ print(' '*pindent + "MERGE {}|{}".format(lst[start:center+1], lst[center+1:end+1]))
+ i,j = 0, 0
+ for k in range(start, end+1):
+ if i >= len(left):
+ lst[k] = right[j]
+ j += 1
+ print(' '*(pindent+1) + 'pull j: {} {} {}'.format(lst[start:k+1], left[i:], right[j:]))
+ elif j >= len(right):
+ lst[k] = left[i]
+ i += 1
+ print(' '*(pindent+1) + 'pull i: {} {} {}'.format(lst[start:k+1], left[i:], right[j:]))
+ elif left[i] > right[j]:
+ lst[k] = right[j]
+ j += 1
+ print(' '*(pindent+1) + 'pull j: {} {} {}'.format(lst[start:k+1], left[i:], right[j:]))
+ else:
+ lst[k] = left[i]
+ i += 1
+ print(' '*(pindent+1) + 'pull i: {} {} {}'.format(lst[start:k+1], left[i:], right[j:]))
+ print(' '*pindent + "-- {}".format(lst[start:end+1]))
+
+
+if __name__ == '__main__':
+ import random as r
+ x = [int(r.random()*12) for i in range(7)]
+ print(x)
+ msort(x, 0, len(x)-1)
+ print(x)
+*/
+
+static void mergesort(std::vector<int>& lst, int start, int end) {
+ if(start == end) return;
+ int center = start + (end-start)/2;
+ mergesort(lst, start, center);
+ mergesort(lst, center+1, end);
+ std::vector<int> left = std::vector<int>(lst.begin()+start, lst.begin()+(center+1));
+ std::vector<int> right = std::vector<int>(lst.begin()+(center+1),lst.begin()+(end+1));
+ int i = 0;
+ int j = 0;
+ for(int k = start; k < (end+1); k++) {
+ if (i >= left.size()) {
+ lst[k] = right[j++];
+ }
+ else if(j >= right.size()) {
+ lst[k] = left[i++];
+ }
+ else if(left[i] > right[j]) {
+ lst[k] = right[j++];
+ }
+ else {
+ lst[k] = left[i++];
+ }
+ }
+}
+
+MergeSorter::MergeSorter() {
+ this->name = std::string("mergesort");
+}
+
+MergeSorter::~MergeSorter() {
+}
+
+void MergeSorter::sort(std::vector<int>& list) const {
+ mergesort(list, 0, list.size()-1);
+}