diff options
author | dhuth <derickhuth@gmail.com> | 2014-11-21 13:35:20 -0700 |
---|---|---|
committer | dhuth <derickhuth@gmail.com> | 2014-11-21 13:35:20 -0700 |
commit | a1834b22c43c282442b0cb164767e6c877cf0e5b (patch) | |
tree | bedc5be7d1bdb8d32c1868caa496a8a1530d8d8a /test-chill/unit-tests/cprog/QuickSorter.cc | |
parent | ded84bb4aec7461738e7b7033d782a518e2c606b (diff) | |
parent | eb9236c5353785472ae132f27e1cfb9f1e4264a5 (diff) | |
download | chill-a1834b22c43c282442b0cb164767e6c877cf0e5b.tar.gz chill-a1834b22c43c282442b0cb164767e6c877cf0e5b.tar.bz2 chill-a1834b22c43c282442b0cb164767e6c877cf0e5b.zip |
Merge branch 'master' into doe
Diffstat (limited to 'test-chill/unit-tests/cprog/QuickSorter.cc')
-rw-r--r-- | test-chill/unit-tests/cprog/QuickSorter.cc | 83 |
1 files changed, 83 insertions, 0 deletions
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); +} |