Odd-Even Transposition Sort is a parallel sorting algorithm. It is based on the Bubble Sort technique, which compares every 2 consecutive numbers in the array and swap them if first is greater than the second to get an ascending order array. It consists of 2 phases – the odd phase and even phase:
- Odd phase: Every odd indexed element is compared with the next even indexed element(considering 1-based indexing).
- Even phase: Every even indexed element is compared with the next odd indexed element.
This article uses the concept of multi-threading, specifically pthread. In each iteration, every pair of 2 consecutive elements is compared using individual threads executing in parallel as illustrated below.
Examples:
Input: { 2, 1, 4, 9, 5, 3, 6, 10 }
Output: 1, 2, 3, 4, 5, 6, 9, 10
Input: { 11, 19, 4, 20, 1, 22, 25, 8}
Output: 1, 4, 8, 11, 19, 20, 22, 25
Note: Compile the program using following command on your Linux based system.
g++ program_name.cpp -pthread
Below is the implementation of the above topic:
CPP
#include <bits/stdc++.h>
#include <pthread.h>
using namespace std;
#define n 8
int max_threads = (n + 1) / 2;
int a[] = { 2, 1, 4, 9, 5, 3, 6, 10 };
int tmp;
void * compare( void * arg)
{
int index = tmp;
tmp = tmp + 2;
if ((index + 1 < n) && (a[index] > a[index + 1])) {
swap(a[index], a[index + 1]);
}
}
void oddEven(pthread_t threads[])
{
int i, j;
for (i = 1; i <= n; i++) {
if (i % 2 == 1) {
tmp = 0;
for (j = 0; j < max_threads; j++)
pthread_create(&threads[j], NULL, compare, NULL);
for (j = 0; j < max_threads; j++)
pthread_join(threads[j], NULL);
}
else {
tmp = 1;
for (j = 0; j < max_threads - 1; j++)
pthread_create(&threads[j], NULL, compare, NULL);
for (j = 0; j < max_threads - 1; j++)
pthread_join(threads[j], NULL);
}
}
}
void printArray()
{
int i;
for (i = 0; i < n; i++)
cout << a[i] << " " ;
cout << endl;
}
int main()
{
pthread_t threads[max_threads];
cout << "Given array is: " ;
printArray();
oddEven(threads);
cout << "\nSorted array is: " ;
printArray();
return 0;
}
|
Python3
from threading import Thread
N = 8
MAX_THREAD = int ((N + 1 ) / 2 )
arr = [ 2 , 1 , 4 , 9 , 5 , 3 , 6 , 10 ]
tmp = 0
def compare():
global tmp
index = tmp
tmp = tmp + 2
if index + 1 < N and arr[index] > arr[index + 1 ]:
arr[index], arr[index + 1 ] = arr[index + 1 ], arr[index]
def createThreads():
threads = list ( range (MAX_THREAD))
for index in range (MAX_THREAD):
threads[index] = Thread(target = compare)
threads[index].start()
for index in range (MAX_THREAD):
threads[index].join()
def oddEven():
global tmp
for i in range ( 1 , N + 1 ):
if i % 2 :
tmp = 0
createThreads()
else :
tmp = 1
createThreads()
if __name__ = = "__main__" :
print ( "Given array is : %s" % arr)
oddEven()
print ( "Sorted array is : %s" % arr)
|
Output:
Given array is: 2 1 4 9 5 3 6 10
Sorted array is: 1 2 3 4 5 6 9 10
Time complexity: The time complexity is reduced to O(N) due to parallel computation using threads. Work complexity: The work complexity of this program is O(N) as N/2 number of threads(resources) are being used to sort the array. So, the work-time complexity of the program is O(N^2).
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
15 Mar, 2023
Like Article
Save Article