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


    在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; }
  • 相关阅读:
    [转]拜占庭故障 & Paxos 算法
    如何让 YARN 支持 CNPM 的完整加速
    面试必问系列:悲观锁和乐观锁的那些事儿
    ajax下载文件的坑
    mac 装homebrew
    SLF4J报错问解决
    java追加文件
    CentOS 清理空间
    Dockerfile 通过 ARG 设置 ENV 无效的原因
    GoLang 中发送 email 邮件
  • 原文地址:https://www.cnblogs.com/wangjunyan/p/5036110.html
Copyright © 2020-2023  润新知