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++];elsesorted[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;
}
欢迎留言交流。。。