奇偶转置排序是一种并行排序算法。它基于冒泡排序技术,该技术对数组中的每2个连续数字进行比较,如果第一个大于第二个则交换它们以获取升序数组。它由2个阶段组成-奇数阶段和偶数阶段:
- 奇数阶段:将每个奇数索引元素与下一个偶数索引元素进行比较(考虑基于1的索引)。
- 偶数阶段:将每个偶数索引元素与下一个奇数索引元素进行比较。
本文使用多线程,特别是pthread的概念。在每次迭代中,使用并行执行的各个线程比较每对2个连续元素,如下所示。
例子:
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
注意:在基于Linux的系统上,使用以下命令编译程序。
g++ program_name.cpp -pthread
以下是上述主题的实现:
// CPP Program for Odd-Even Transpostion sort
// using pthreads
#include
#include
using namespace std;
// size of array
#define n 8
// maximum number of threads
int max_threads = (n + 1) / 2;
int a[] = { 2, 1, 4, 9, 5, 3, 6, 10 };
int tmp;
// Function to compare and exchange
// the consecutive elements of the array
void* compare(void* arg)
{
// Each thread compares
// two consecutive elements of the array
int index = tmp;
tmp = tmp + 2;
if ((a[index] > a[index + 1]) && (index + 1 < n)) {
swap(a[index], a[index + 1]);
}
}
void oddEven(pthread_t threads[])
{
int i, j;
for (i = 1; i <= n; i++) {
// Odd step
if (i % 2 == 1) {
tmp = 0;
// Creating threads
for (j = 0; j < max_threads; j++)
pthread_create(&threads[j], NULL, compare, NULL);
// joining threads i.e. waiting
// for all the threads to complete
for (j = 0; j < max_threads; j++)
pthread_join(threads[j], NULL);
}
// Even step
else {
tmp = 1;
// Creating threads
for (j = 0; j < max_threads - 1; j++)
pthread_create(&threads[j], NULL, compare, NULL);
// joining threads i.e. waiting
// for all the threads to complete
for (j = 0; j < max_threads - 1; j++)
pthread_join(threads[j], NULL);
}
}
}
// Function to print an array
void printArray()
{
int i;
for (i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
// Driver Code
int main()
{
pthread_t threads[max_threads];
cout << "Given array is: ";
printArray();
oddEven(threads);
cout << "\nSorted array is: ";
printArray();
return 0;
}
输出:
Given array is: 2 1 4 9 5 3 6 10
Sorted array is: 1 2 3 4 5 6 9 10
时间复杂度:由于使用线程进行并行计算,因此时间复杂度降低为O(N)。
工作复杂度:该程序的工作复杂度为O(N),因为正在使用N / 2个线程(资源)对数组进行排序。因此,程序的工作时间复杂度为O(N ^ 2)。
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。