From a0d5c9aaf0f573ff11beacb6a30a91f90312dd08 Mon Sep 17 00:00:00 2001 From: Aruj Sharma Date: Mon, 11 Feb 2019 15:23:49 +0530 Subject: [PATCH] Create BitonicSort.py (#386) --- sorts/BitonicSort.py | 56 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 sorts/BitonicSort.py diff --git a/sorts/BitonicSort.py b/sorts/BitonicSort.py new file mode 100644 index 000000000..bae95b434 --- /dev/null +++ b/sorts/BitonicSort.py @@ -0,0 +1,56 @@ +# Python program for Bitonic Sort. Note that this program +# works only when size of input is a power of 2. + +# The parameter dir indicates the sorting direction, ASCENDING +# or DESCENDING; if (a[i] > a[j]) agrees with the direction, +# then a[i] and a[j] are interchanged.*/ +def compAndSwap(a, i, j, dire): + if (dire == 1 and a[i] > a[j]) or (dire == 0 and a[i] < a[j]): + a[i], a[j] = a[j], a[i] + + # 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. +def bitonicMerge(a, low, cnt, dire): + if cnt > 1: + k = int(cnt / 2) + for i in range(low, low + k): + compAndSwap(a, i, i + k, dire) + bitonicMerge(a, low, k, dire) + bitonicMerge(a, low + k, k, dire) + + # This funcion first produces a bitonic sequence by recursively + + +# sorting its two halves in opposite sorting orders, and then +# calls bitonicMerge to make them in the same order +def bitonicSort(a, low, cnt, dire): + if cnt > 1: + k = int(cnt / 2) + bitonicSort(a, low, k, 1) + bitonicSort(a, low + k, k, 0) + bitonicMerge(a, low, cnt, dire) + + # Caller of bitonicSort for sorting the entire array of length N + + +# in ASCENDING order +def sort(a, N, up): + bitonicSort(a, 0, N, up) + + +# Driver code to test above +a = [] + +n = int(input()) +for i in range(n): + a.append(int(input())) +up = 1 + +sort(a, n, up) +print("\n\nSorted array is") +for i in range(n): + print("%d" % a[i])