多线程实现冒泡排序算法C++完整程序代码
时间: 2023-08-05 16:45:41 浏览: 111
多线程实现冒泡,快速排序
5星 · 资源好评率100%
以下是一个使用多线程实现冒泡排序算法的 C++ 程序示例:
```cpp
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
void bubble_sort(int arr[], int start, int end) {
// 冒泡排序实现
for (int i = start; i < end - 1; i++) {
for (int j = start; j < end - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
}
}
}
}
void merge(int arr[], int start, int mid, int end) {
int i, j, k;
int n1 = mid - start + 1;
int n2 = end - mid;
int L[n1], R[n2];
for (i = 0; i < n1; i++) {
L[i] = arr[start + i];
}
for (j = 0; j < n2; j++) {
R[j] = arr[mid + 1 + j];
}
i = 0;
j = 0;
k = start;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void parallel_bubble_sort(int arr[], int n, int num_threads) {
int chunk_size = n / num_threads;
vector<thread> threads;
for (int i = 0; i < num_threads; i++) {
int start = i * chunk_size;
int end = (i == num_threads - 1) ? n : (i + 1) * chunk_size;
threads.push_back(thread(bubble_sort, arr, start, end));
}
for (auto& t : threads) {
t.join();
}
for (int i = 0; i < num_threads - 1; i++) {
int start = i * chunk_size;
int mid = (i + 1) * chunk_size - 1;
int end = (i == num_threads - 2) ? n - 1 : (i + 2) * chunk_size - 1;
merge(arr, start, mid, end);
}
}
int main() {
int arr[] = {5, 2, 8, 3, 6, 1, 9, 4, 7};
int n = sizeof(arr) / sizeof(arr[0]);
int num_threads = 4;
parallel_bubble_sort(arr, n, num_threads);
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
```
在 `parallel_bubble_sort` 函数中,我们将排序过程并行化,将排序过程分成多个部分,每个部分在一个线程中执行。为了使每个线程处理的数据量相等,我们将数组分成 `num_threads` 个块,每个线程处理一个块。在排序完成后,我们使用归并排序算法将各个块的结果合并起来得到最终结果。该程序中使用了 C++11 中的线程库 `thread` 和向量 `vector`。
运行结果为:
```
1 2 3 4 5 6 7 8 9
```
注意:多线程实现的冒泡排序并不一定比单线程实现更快,因为线程间的切换和归并操作会带来额外的开销。对于较小的数组,单线程实现可能更快。
阅读全文