sort.c: 多线程排序
• 主线程创建一个辅助线程
• 主线程使用选择排序算法对数组的前半部分排序
• 辅助线程使用选择排序算法对数组的后半部分排序
• 主线程等待辅助线程运行結束后,使用归并排序算法归并数组的前半部分和后半部分
实现思路:
ARRAY_COUNT
存放要进行排序的数字的个数,need_sort_array[ARRAY_COUNT]
;记录待排序的数字,sorted[ARRAY_COUNT]
用来记录归并排序的结果。
副线程通过调用void *worker(void *arg)
函数实现对数组的前半部分的排序,采用插入排序实现,主线程,通过worker()
函数实现,同样采用插入排序,最后的归并排序通过Merge_array()
实现。
实现代码:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#define ARRAY_COUNT 10
int need_sort_array[10]={5,7,8,5,24,25,67,33,1,55};
int sorted[10];
void *worker(void *arg){
int i,j;
int tmp;
int Min;
for(i=0;i<ARRAY_COUNT/2;i++){
Min=i;
for(j=i+1;j<ARRAY_COUNT/2;j++){
if(need_sort_array[Min]>need_sort_array[j])
Min=j;
}
tmp=need_sort_array[i];
need_sort_array[i]=need_sort_array[Min];
need_sort_array[Min]=tmp;
}
}
void master(){
int i,j;
int tmp;
int Min;
for(i=ARRAY_COUNT/2;i<ARRAY_COUNT;i++){
Min=i;
for(j=i+1;j<ARRAY_COUNT;j++){
if(need_sort_array[Min]>need_sort_array[j])
Min=j;
}
tmp=need_sort_array[i];
need_sort_array[i]=need_sort_array[Min];
need_sort_array[Min]=tmp;
}
}
void Merge_Array(){
int i=0,j=ARRAY_COUNT/2,k=0;
while(i<ARRAY_COUNT/2&&j<ARRAY_COUNT){
if(need_sort_array[i]<need_sort_array[j])
sorted[k++]=need_sort_array[i++];
else
sorted[k++]=need_sort_array[j++];
}
while(i<ARRAY_COUNT/2)
sorted[k++]=need_sort_array[i++];
while(j<ARRAY_COUNT)
sorted[k++]=need_sort_array[j++];
}
void print(int *array){
int i;
for(i=0;i<ARRAY_COUNT;i++)
printf("%d ",array[i]);
printf("\n");
}
int main(){
pthread_t pid;
printf("Before sort,need_sort_array: ");
print(need_sort_array);
pthread_create(&pid,NULL,&worker,NULL);
master();
pthread_join(pid,NULL);
printf("After sorted,need_sort_array: ");
print(need_sort_array);
Merge_Array();
printf("sorted array: ");
print(sorted);
return 0;
}
欢迎留言交流。。。