• 多线程快速排序(思考)


    在CSDN看到的一位牛人实现的多线程快排,暂时没细看,但是感觉有点小问题,他的多线程快排并没有实现我所想要的那种并行计算的结果,我理想中的多线程排序
    (这里特指快排)应该是类似于mapreduce的分拆和合并,在快排中,分拆是必然(和归并一样,基因决定嘛),分拆后的数组可以形成队列,按照核心数分给每个线程
    进行排序,然后进行归并。打算找个时间自己实现一下。

    #include <stdio.h> #include <windows.h> #include <time.h> #include <stdlib.h> #define NUM 10000*1000 //设置数组中的数据量,设定为1000万 HANDLE hMutex; int count=0; //记录创建线程的总数量 struct ThreadSortData //定义为多线程函数传递的参数 { int *p; //指向数组的指针 int i; //数组段的起始序号 int j; //数组段的结束序号 }; DWORD WINAPI ThreadQuickSort(LPVOID lpParam) //多线程快速排序 { int i=((ThreadSortData *)lpParam)->i; //直接使用参数太麻烦,重新申请短变量并赋值 int j=((ThreadSortData *)lpParam)->j; int *num=((ThreadSortData *)lpParam)->p; count++; int start=i; //记录起始序号 int end=j; //记录结束序号 int key=num[i]; //保存关键值 while(i<j) //排序 { while(i<j && num[j]>=key) { j--; } num[i]=num[j]; while(i<j && num[i]<=key) { i++; } num[j]=num[i]; } num[i]=key; HANDLE hThread1; HANDLE hThread2; if((i-start)>1) //如果本段数组关键字的左端至少有两个数据,那么继续排序 { ThreadSortData *pData1=new ThreadSortData; pData1->i=start; pData1->j=i-1; pData1->p=num; hThread1=CreateThread(NULL,0,ThreadQuickSort,(LPVOID)pData1,0,NULL); } if((end-j)>1) //如果本段数组关键字的右端至少有两个数据,那么继续排序 { ThreadSortData *pData2=new ThreadSortData; pData2->i=i+1; pData2->j=end; pData2->p=num; hThread2=CreateThread(NULL,0,ThreadQuickSort,(LPVOID)pData2,0,NULL); } WaitForSingleObject(hThread1,INFINITE); //子线程执行完毕后主线程再继续运行 WaitForSingleObject(hThread2,INFINITE); //子线程执行完毕后主线程再继续运行 CloseHandle(hThread1); CloseHandle(hThread2); delete[] lpParam; //释放动态内存 return TRUE; } void main() { srand(GetTickCount()); int *num=new int[NUM]; int temp; for(int i=0;i<NUM;i++) { temp=rand()+rand(); num[i]=(temp<<16)+rand()+rand(); //为了保证数组中所有的值在-2^31到2^31-1之间均匀分布 } printf(" "); ThreadSortData *pData=new ThreadSortData; //申请的动态内存在创建的线程中释放 pData->p=num; pData->i=0; pData->j=NUM-1; HANDLE hThread; hMutex=CreateMutex(NULL,FALSE,NULL); int time=GetTickCount(); //线程开始时计数 hThread=CreateThread(NULL,0,ThreadQuickSort,(LPVOID)pData,0,NULL); WaitForSingleObject(hThread,INFINITE); //子线程执行完毕后主线程再继续运行 time=GetTickCount()-time; //线程结束时所花费的时间 CloseHandle(hThread); //关闭线程句柄 /* for(i=0;i<NUM;i++) //输出数据 { printf("%d ",num[i]); } printf(" ");*/ printf("一共创建了%d个线程 ",count); //输出总线程数 printf("一共花费了%d毫秒 ",time); //输出总线程数 delete[] num; }
  • 相关阅读:
    Mysql问题1862
    S3TC IAP15F2K61S2点亮一个发光二极管keil和stc-isp软件操作
    .NET练习计算平方根
    求一个整数以内的素数(函数实现)
    判断一个数是不是素数(函数实现)
    #号在进制输出值的作用,美化输出
    分类——决策树模型(附有决策树生成步骤)
    分类:贝叶斯分类之新闻组数据组学习(查看数据类型的方法)(环境:Pycharm)
    分类:K-近邻分类之鸢尾花数据集学习(包含数据预处理中的标准化)(环境:Pycharm)
    编写一个程序,求2~n间的素数,n由键盘输入,循环变量分别 从2到n、2到(int)sqrt(n),分别测出两个循环的所用时间。
  • 原文地址:https://www.cnblogs.com/wangjunyan/p/5036110.html
Copyright © 2020-2023  润新知