- 分享
超级超级超级超级超级奇怪の排序算法!
- 2024-12-25 21:47:24 @
时间复杂度:你要排序的数字中的最大值!!!
时间复杂度:
创建和启动线程:
为每个数组元素创建一个线程,并在线程中执行排序操作。
在启动线程时,使用一个条件变量和互斥锁来同步所有线程的开始时间,确保所有线程在同一时刻开始运行。
线程暂停:
在每个线程中,让线程暂停一段时间,具体的暂停时间与对应的数字成比例。比如,数字越大,暂停时间越长。
将数字插入结果数组:
在暂停结束后,使用互斥锁保护共享的结果数组,将数字插入结果数组。
这样可以确保多个线程不会同时访问和修改结果数组,避免数据竞争。
等待所有线程完成:
使用 join 方法确保主线程等待所有子线程执行完毕。
输出排序后的数组:
最后,输出结果数组,它应该是按从小到大排序好的数组。
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <chrono>
#include <condition_variable>
#include <cstdlib>
#include <ctime>
#include <algorithm>
using namespace std;
// 共享的结果数组
vector<int> sortedArray;
mutex mtx; // 互斥锁保护数组
condition_variable cv;
bool start = false; // 开始信号
void sortElement(int value) {
{
unique_lock<mutex> lock(mtx);
cv.wait(lock, [] { return start; });
}
// 让线程暂停value毫秒(乘以20扩大时间差异)
this_thread::sleep_for(chrono::milliseconds(value * 20));
// 加锁以
lock_guard<mutex> lock(mtx);
sortedArray.push_back(value);
}
int main() {
srand(time(0));
vector<int> arr(100);//100个
cout << "Random elements: ";
for (int i = 0; i < 100; ++i) {
arr[i] = rand() % 100 + 1; // 生成 1 到 100 的随机数
cout << arr[i] << " ";
}
cout << endl;
vector<thread> threads;
for (int value : arr) {
threads.push_back(thread(sortElement, value));
}
{//大括号限制作用域
lock_guard<mutex> lock(mtx);
start = true;
}
cv.notify_all(); // 通知所有线程开始运行
for (auto& th : threads) {
th.join();
}
cout << "Sorted array: ";
for (int value : sortedArray) {
cout << value << " ";
}
cout << endl;
cout << "Is Sorted? : ";
if (is_sorted(sortedArray.begin(), sortedArray.end())) cout << "Yes";
else cout << "No";
return 0;
}
最后一个用来检测数组是否排序,此方法有的时候会抽风,但概率不大。
5 comments
-
Csvoner SU @ 2025-1-1 11:00:11
等讲完十大排序算法就老实了
👍 1 -
2024-12-27 23:16:21@
6 哥们都干到多线程了)这几天才刚学到这个)以后看你代码估计就看不懂了)
👍 4 -
2024-12-25 21:52:07@
若此方法排序的元素过多,可能会因为线程过多而爆线程导致结果爆炸,测试结果最多排序500个元素左右
此方法纯乐子,请勿模仿
-
2024-12-25 21:51:11@
看不懂思密达
👍 2 -
2024-12-25 21:49:59@
建议加入陕西省西安中学非物质文化遗产名录
👍 6
- 1