IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ 多线程归并排序尝试 -> 正文阅读

[C++知识库]C++ 多线程归并排序尝试

#if __cplusplus < 201103L
#error This file requires compiler and library support for the \
ISO C++ 2011 standard. This support is currently experimental, and must be \
enabled with the -std=c++11 or -std=gnu++11 compiler options. /// 这段话来自,<c++0x_warning.h>  
#endif

//#pragma GCC optimize(2) /// O2 优化 

#include <iostream>
#include <ctime>
#include <thread> /// C++ 11 标准的多线程写法 
#include <algorithm>
using namespace std;

int NOT_THREAD = (980); /// 多大长度一下不开启新线程 

const int maxn = 1000000 + 7;
int A[maxn], B[maxn];
void thread_merge_sort(int L, int R) { /// 多线程归并排序 
	if(L >= R) return;
	if(R - L == 1) {
		if(A[L] > A[R]) swap(A[L], A[R]); /// 区间中只有两个数的情况 
	}else {
		int mid = (L + R) >> 1;
		if(R - L >= NOT_THREAD) {
			thread Lth(thread_merge_sort, L,   mid);
			thread_merge_sort(mid + 1, R); /// 右半部分直接在当前线程排序 
			Lth.join();
		}else {
			thread_merge_sort(L,   mid);
			thread_merge_sort(mid+1, R); /// 直接递归计算,不建立新的线程 
		}
		int l = L, r = mid+1, m = L;
		while(l <= mid && r <= R) {
			if(A[l] <= A[r]) B[m ++] = A[l ++];
			else             B[m ++] = A[r ++];
		}
		while(l <= mid) B[m ++] = A[l ++];
		while(r <= R  ) B[m ++] = A[r ++];
		for(int i = L; i <= R; i ++) A[i] = B[i];
	}
}

int rand(int L, int R) {
	int RND = rand(); /// linux 下直接使用 rand() 生成随机数即可 
	#ifdef _WIN64
		RND = (rand() << 15) | RND;
	#endif
	#ifdef _WIN32
		RND = (rand() << 15) | RND;
	#endif
	return RND % (R - L + 1) + L;
}

class timer { /// 计时器 
	private:
		long long time_begin;
	public:
		timer(bool auto_begin = true) { /// 默认自动开始计时 
			if(auto_begin) {
				time_begin = clock();
			}
		}
		void begin() {
			time_begin = clock(); /// 开始计时 
		}
		double time_now() {
			return (clock() - time_begin)/(CLOCKS_PER_SEC * 1.0); /// 计算当前时刻 
		}
};

void Check(bool use_threads = true) {
	printf(use_threads ? "=> Threads\t[ available ]\n" : "=> Threads\t[unavailable]\n");
	printf(
		#ifdef _WIN64
			"-> _WIN64\t[ availalbe ]\n" /// 编译器 win64 环境 
		#endif
		#ifdef _WIN32
			"-> _WIN32\t[ available ]\n" /// 编译器 win32 环境 
		#endif
			"-> default\t[ available ]\n"
	);
	ios::sync_with_stdio(false); /// 关闭同步 
	int n = 1000000;
	for(int i = 1; i <= n; i ++) A[i] = rand(1, 1000000000); /// 输入被排序的序列 
	if(!use_threads) NOT_THREAD = 0x7fffffff; /// 不适用多线程 
	timer Timer; 
	thread_merge_sort(1, n); /// 多线程归并排序 
	printf("=> n = %d, Timer: %.3lf sec\n\n\n", n, Timer.time_now());
}

int main() {
	Check( true); /// 使用多线程 
	Check(false); /// 不使用多线程 
	return 0;
}

本地运行结果

可以看到,多线程归并排序比直接使用归并排序快了 31.25 % 31.25\% 31.25%(因 CPU 而异)。

O2优化后的效果对比图

开启 -O2 优化前后,多线程归并排序算法的运行效率提升并不显著,但是普通归并排序的效果有显著提升。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:22:34  更:2021-08-24 15:24:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 6:43:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计