diff --git a/CPP/Bitonic_Sort.cpp b/CPP/Bitonic_Sort.cpp new file mode 100644 index 00000000..7a496141 --- /dev/null +++ b/CPP/Bitonic_Sort.cpp @@ -0,0 +1,68 @@ +#include +using namespace std; + + +void compAndSwap(int a[], int i, int j, int dir) +{ + if (dir==(a[i]>a[j])) + swap(a[i],a[j]); +} + +/*It recursively sorts a bitonic sequence in ascending order, +if dir = 1, and in descending order otherwise (means dir=0). +The sequence to be sorted starts at index position low, +the parameter cnt is the number of elements to be sorted.*/ +void bitonicMerge(int a[], int low, int cnt, int dir) +{ + if (cnt>1) + { + int k = cnt/2; + for (int i=low; i1) + { + int k = cnt/2; + + // sort in ascending order since dir here is 1 + bitonicSort(a, low, k, 1); + + // sort in descending order since dir here is 0 + bitonicSort(a, low+k, k, 0); + + // Will merge whole sequence in ascending order + // since dir=1. + bitonicMerge(a,low, cnt, dir); + } +} + +/* Caller of bitonicSort for sorting the entire array of +length N in ASCENDING order */ +void sort(int a[], int N, int up) +{ + bitonicSort(a,0, N, up); +} + +// Driver code +int main() +{ + int a[]= {3, 7, 4, 8, 6, 2, 1, 5}; + int N = sizeof(a)/sizeof(a[0]); + + int up = 1; // means sort in ascending order + sort(a, N, up); + + printf("Sorted array: \n"); + for (int i=0; i