diff options
author | Derick Huth <derickhuth@gmail.com> | 2016-02-10 11:13:08 -0700 |
---|---|---|
committer | Derick Huth <derickhuth@gmail.com> | 2016-02-10 11:13:08 -0700 |
commit | 1dd03ee01bff2a70e758ce984476527f3ff42c68 (patch) | |
tree | 9731867c7019ec9b6ee111c8fa9f92a92119b5ec /test-chill/unit-tests/cprog | |
parent | 4631ad76927d433da5d55c3c373a1dfd0f74c9d4 (diff) | |
parent | d68532f2f3ba332199f84818cb047d69a3f33588 (diff) | |
download | chill-1dd03ee01bff2a70e758ce984476527f3ff42c68.tar.gz chill-1dd03ee01bff2a70e758ce984476527f3ff42c68.tar.bz2 chill-1dd03ee01bff2a70e758ce984476527f3ff42c68.zip |
Merge pull request #8 from dhuth/master
w/ python test suite
Diffstat (limited to 'test-chill/unit-tests/cprog')
-rw-r--r-- | test-chill/unit-tests/cprog/Makefile | 17 | ||||
-rw-r--r-- | test-chill/unit-tests/cprog/MergeSorter.cc | 77 | ||||
-rw-r--r-- | test-chill/unit-tests/cprog/MergeSorter.h | 14 | ||||
-rw-r--r-- | test-chill/unit-tests/cprog/QuickSorter.cc | 83 | ||||
-rw-r--r-- | test-chill/unit-tests/cprog/QuickSorter.h | 14 | ||||
-rw-r--r-- | test-chill/unit-tests/cprog/Sorter.cc | 8 | ||||
-rw-r--r-- | test-chill/unit-tests/cprog/Sorter.h | 16 | ||||
-rw-r--r-- | test-chill/unit-tests/cprog/main.cc | 45 |
8 files changed, 274 insertions, 0 deletions
diff --git a/test-chill/unit-tests/cprog/Makefile b/test-chill/unit-tests/cprog/Makefile new file mode 100644 index 0000000..f5f2608 --- /dev/null +++ b/test-chill/unit-tests/cprog/Makefile @@ -0,0 +1,17 @@ +OBJS = $(patsubst %.cc, %.o, $(wildcard *.cc)) + +.PHONY: all +all: sorter + +$(OBJS): %.o: %.cc + g++ -g -fprofile-arcs -ftest-coverage -c $< -o $@ + +.PHONY: sorter +sorter: $(OBJS) + g++ -g -fprofile-arcs -ftest-coverage -o bin/sorter $(OBJS) + +.PHONY: clean +clean: + rm -f *.o + rm -f *.gcno *.gcda *.gcov + rm -f bin/sorter 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); +} diff --git a/test-chill/unit-tests/cprog/MergeSorter.h b/test-chill/unit-tests/cprog/MergeSorter.h new file mode 100644 index 0000000..e2ed391 --- /dev/null +++ b/test-chill/unit-tests/cprog/MergeSorter.h @@ -0,0 +1,14 @@ +#ifndef MERGE_SORTER_H +#define MERGE_SORTER_H + +#include <vector> +#include "Sorter.h" + +class MergeSorter : public Sorter { +public: + MergeSorter(); + virtual ~MergeSorter(); + virtual void sort(std::vector<int>& list) const; +}; + +#endif diff --git a/test-chill/unit-tests/cprog/QuickSorter.cc b/test-chill/unit-tests/cprog/QuickSorter.cc new file mode 100644 index 0000000..3ade346 --- /dev/null +++ b/test-chill/unit-tests/cprog/QuickSorter.cc @@ -0,0 +1,83 @@ +#include "QuickSorter.h" + +/* Python + +def swap(l, i, k): + v = l[i] + l[i] = l[k] + l[k] = v + print(str(l)) + +def partition(l, start, end): + print("PARTITION {} [{}:{}]".format(l, start, end)) + p_value = l[end] + p_index = end-1 + + for i in range(start, end): + while(i < p_index and l[i] >= p_value): + swap(l, i, p_index) + p_index -= 1 + while(i >= p_index and l[i] < p_value): + swap(l, i, p_index) + p_index += 1 + swap(l, p_index, end) + print("DONE {}|[{}]|{}:{}".format(l[start:p_index], l[p_index], l[p_index+1:end+1], p_value)) + return p_index + +def qsort(l, i, k): + if i < k: + p = partition(l, i, k) + qsort(l,i,p-1) + qsort(l,p+1,k) + +if __name__ == "__main__": + import random as r + x = [int(r.random()*12) for i in range(12)] + print(x) + qsort(x, 0, len(x)-1) + print(x) + +*/ + +static void swap(std::vector<int>& list, int i, int k) { + int v = list[i]; + list[i] = list[k]; + list[k] = v; +} + +static int partition(std::vector<int>& list, int i, int k) { + int pivot_value = list[k]; + int pivot_index = k - 1; + + for(int index = i; index < k; index++) { + while((index < pivot_index) && (list[index] >= pivot_value)) { + swap(list, index, pivot_index); + pivot_index--; + } + while((index >= pivot_index) && (list[index] < pivot_value)) { + swap(list, index, pivot_index); + pivot_index++; + } + } + swap(list, pivot_index, k); + return pivot_index; +} + +static void quicksort(std::vector<int>& list, int i, int k) { + if(i < k) { + int p = partition(list, i, k); + quicksort(list, i, p-1); + quicksort(list, p+1, k); + } +} + +QuickSorter::QuickSorter() { + this->name = std::string("quicksort"); +} + +QuickSorter::~QuickSorter() { +} + +void QuickSorter::sort(std::vector<int>& list) const { + quicksort(list, 0, list.size()-1); +} diff --git a/test-chill/unit-tests/cprog/QuickSorter.h b/test-chill/unit-tests/cprog/QuickSorter.h new file mode 100644 index 0000000..81919dd --- /dev/null +++ b/test-chill/unit-tests/cprog/QuickSorter.h @@ -0,0 +1,14 @@ +#ifndef QUICK_SORTER_H +#define QUICK_SORTER_H + +#include <vector> +#include "Sorter.h" + +class QuickSorter : public Sorter { +public: + QuickSorter(); + virtual ~QuickSorter(); + virtual void sort(std::vector<int>& list) const; +}; + +#endif diff --git a/test-chill/unit-tests/cprog/Sorter.cc b/test-chill/unit-tests/cprog/Sorter.cc new file mode 100644 index 0000000..a1ae5ec --- /dev/null +++ b/test-chill/unit-tests/cprog/Sorter.cc @@ -0,0 +1,8 @@ +#include "Sorter.h" + +Sorter::Sorter() { +} + +Sorter::~Sorter() { +} + diff --git a/test-chill/unit-tests/cprog/Sorter.h b/test-chill/unit-tests/cprog/Sorter.h new file mode 100644 index 0000000..abf8f82 --- /dev/null +++ b/test-chill/unit-tests/cprog/Sorter.h @@ -0,0 +1,16 @@ +#ifndef SORTER_H +#define SORTER_H + +#include <string> +#include <vector> + +class Sorter { +public: + Sorter(); + virtual ~Sorter(); + + std::string name; + virtual void sort(std::vector<int>& list) const = 0; +}; + +#endif diff --git a/test-chill/unit-tests/cprog/main.cc b/test-chill/unit-tests/cprog/main.cc new file mode 100644 index 0000000..3fe960b --- /dev/null +++ b/test-chill/unit-tests/cprog/main.cc @@ -0,0 +1,45 @@ +#include <cstdio> +#include <cstdlib> +#include <map> +#include <string> +#include <vector> + +#include "Sorter.h" +#include "QuickSorter.h" +#include "MergeSorter.h" +//#include "InsertionSorter.h" +//#include "ShellSorter.h" + +void read_vector(std::vector<int>& vec, int start, int stop, char** argv) { + for(int i = start; i < stop; i++) { + vec.push_back((int)strtol(argv[i],NULL,0)); + } +} + +void print_vector(std::vector<int>& vec) { + printf("["); + for(std::vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) { + printf(" %d ", *iter); + } + printf("]\n"); +} + +void addsorter(std::map<std::string, Sorter*>& m, Sorter* s) { + m[s->name] = s; +} + +int main(int argc, char** argv) { + std::map<std::string, Sorter*> sorter_map; + std::vector<int> vec; + + read_vector(vec, 2, argc, argv); + print_vector(vec); + + addsorter(sorter_map, new QuickSorter()); + addsorter(sorter_map, new MergeSorter()); + //addsorter(sorter_map, new InsertionSorter()); + //addsorter(sorter_map, new ShellSorter()); + sorter_map[std::string(argv[1])]->sort(vec); + print_vector(vec); +} + |