多线程排序+快速排序
来源:互联网 发布:java jdbc 删除数据 编辑:程序博客网 时间:2024/06/06 01:00
多线程排序,主要是将整个排序的序列分成若干份,每一个线程排序一份,所以线程排序完成之后,就进行归并,相当于多个有序序列合并成一个有序序列。
这里就需要用到线程屏障,也就是 pthread_barrier 系列函数。
屏障,通俗的说就是一个比赛跑步的过程,所以队员就绪了,才能进行比赛。
多线程排序也是,需要每个线程都是排序完成后,才能进行合并的过程。
代码:
#include <cstdio>#include <cstring>#include <iostream>#include <cstdlib>#include <sys/time.h>#include <pthread.h>#include <algorithm>using namespace std;const long MAX = 10000000L; //数组中最大数const long long MAX_NUM = 100000000L; //排序数const int thread = 4; //线程数const int thread_num = MAX_NUM / thread; //每个线程排序的个数int num[MAX_NUM];int tmp_num[MAX_NUM];pthread_barrier_t barrier;/** * Initialized Data */void init(){srandom((int)time(NULL));for(int i = 0; i < MAX_NUM; ++i)num[i] = random() % MAX;}/** *quick sort function */void qsorts(int *start, int *end){int nums = end - start;if(nums > 0){int index = 0;int flag = start[0];int i = 0, j = nums;while(i != j){while(j > i && start[j] >= flag)--j;start[index] = start[j];index = j;while(i < j && start[i] <= flag)++i;start[index] = start[i];index = i;}start[index] = flag;qsorts(start, start + (i - 1));qsorts(start + j + 1, end);}}void* work(void *arg) //线程排序函数{long index = (long)arg;qsorts(num + index, num + index + thread_num - 1);pthread_barrier_wait(&barrier);pthread_exit(NULL);}void meger() //最终合并函数{long index[thread];for (int i = 0; i < thread; ++i){index[i] = i * thread_num;}for(long i = 0; i < MAX_NUM; ++i){long min_index;long min_num = MAX;for(int j = 0; j < thread; ++j){if((index[j] < (j + 1) * thread_num) && (num[index[j]] < min_num)){min_index = j;min_num = num[index[j]];}}tmp_num[i] = num[index[min_index]];index[min_index]++;}}int main(int argc, char const *argv[]){init();struct timeval start, end;pthread_t ptid;//printf("%ld %ld\n", num[1], num[2]);gettimeofday(&start, NULL);//init pthread and Thread barrier//add 1, total have (thread + 1) threads.pthread_barrier_init(&barrier, NULL, thread + 1);for(int i = 0; i < thread; ++i)pthread_create(&ptid, NULL, work, (void *)(i * thread_num));pthread_barrier_wait(&barrier);meger();// use one thread to sort// qsorts(num, num + MAX_NUM - 1);gettimeofday(&end, NULL);long long s_usec = start.tv_sec * 1000000 + start.tv_usec;long long e_usec = end.tv_sec * 1000000 + end.tv_usec;double useTime = (double)(e_usec - s_usec) / 1000000.0;printf("sort use %.4f seconds\n", useTime);FILE *fp = fopen("result2.txt", "w+");for(long long i = 0; i < MAX_NUM; ++i)fprintf(fp, "%ld ", num[i]);return 0;}
当使用单线程排序时:
sort use 34.0476 seconds
当使用2线程排序时:
sort use 19.7711 seconds当使用4线程排序时:
sort use 16.0659 seconds
当使用8线程排序时:
sort use 16.8172 seconds
如果使用STL中的函数的sort,将会更快。
阅读全文
5 0
- 多线程排序+快速排序
- QT多线程快速排序
- c++11 版多线程 快速排序
- 用多线程进行的序列快速排序
- 用多线程判断快速排序和冒泡排序的速度
- 排序之快速排序
- 排序算法--快速排序
- 插入排序,快速排序
- 快速排序 冒泡排序
- 排序算法--快速排序
- 排序之 快速排序
- 排序之快速排序
- 快速排序、冒泡排序
- 排序---快速排序
- 排序4快速排序
- 【排序】快速排序
- 排序算法---快速排序
- 快速排序,选择排序
- Android 技术重温系列 (10)- UI 组件
- Liquibase使用
- 分数化为埃及分数 跨度为5
- poj 3691 DAN repair
- C语言-一个简单的计算器。。。。。
- 多线程排序+快速排序
- java实时改变Jlabel的值
- Spark单机模式搭建
- Spring-Boot拦截器
- mysql-proxy数据库中间件架构(58沈剑)
- Python3 OOP面向对象编程最基本的类
- 用BDP完美呈现城市出行路径可视化【笔记】
- 软件开发可行性分析规范
- PY_TimeComplexity