操作系统上机作业--多线程排序

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;
}

这里写图片描述
欢迎留言交流。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值